Transcript
Page 1: Learn Ruby Programming in Amc Square Learning

Learn RUBY Programming at AMC Square Learning

• An interpreted language • a.k.a dynamic, scripting• e.g., Perl

• Object Oriented• Single inheritance

• High level• Good support for system calls, regex and CGI

• Relies heavily on convention for syntax

Page 2: Learn Ruby Programming in Amc Square Learning

Hello World#!/usr/bin/env ruby

puts “Hello world”

$ chmod a+x helloWorld.rb

$ helloWorld.rb

Hello world

$

• shell script directive to run ruby• Needed to run any shell script

• Call to method puts to write out “Hello world” with CR

• Make program executable

Page 3: Learn Ruby Programming in Amc Square Learning

Basic Ruby

• Everything is an object• Variables are not typed• Automatic memory allocation and garbage

collection• Comments start with # and go to the end of the line

• You have to escape \# if you want them elsewhere• Carriage returns mark the end of statements• Methods marked with def … end

Page 4: Learn Ruby Programming in Amc Square Learning

Control structures

If…elsif…else…endcase when <condition> then

<value>… else… end

unless <condition> … endwhile <condition>… enduntil <condition>… end

#.times (e.g. 5.times())#.upto(#) (e.g. 3.upto(6))

<collection>.each {block}

• elsif keeps blocks at same level• case good for checks on multiple

values of same expression; can use ranges

grade = case score when 90..100 then “A” when 80..90 then “B” else “C” end

• Looping constructs use end (same as class definitions)

• Various iterators allow code blocks to be run multiple times

Page 5: Learn Ruby Programming in Amc Square Learning

Ruby Naming Conventions

• Initial characters• Local variables, method parameters, and method names

lowercase letter or underscore• Global variable $• Instance variable @• Class variable @@• Class names, module names, constants uppercase letter

• Multi-word names• Instance variables separate words with underscores• Class names use MixedCase

• End characters• ? Indicates method that returns true or false to a query• ! Indicates method that modifies the object in place rather than

returning a copy (destructive, but usually more efficient)

Page 6: Learn Ruby Programming in Amc Square Learning

Another Exampleclass Temperature Factor = 5.0/9

def store_C(c) @celsius = c end

def store_F(f) @celsius = (f - 32)*Factor end

def as_C @celsius end

def as_F (@celsius / Factor) + 32 endend # end of class definition

Factor is a constant5.0 makes it a float

4 methods that get/set an instance variable

Last evaluated statement is considered the return value

Page 7: Learn Ruby Programming in Amc Square Learning

Second Tryclass Temperature Factor = 5.0/9 attr_accessor :c

def f=(f) @c = (f - 32) * Factor end

def f (@c / Factor) + 32 end

def initialize (c) @c = c endend

t = Temperature.new(25)puts t.f # 77.0t.f = 60 # invokes f=()puts t.c # 15.55

attr_accessor creates setter and getter methods automatically for a class variable

initialize is the name for a classes’ constructor

Don’t worry - you can always override these methods if you need to

Calls to methods don’t need () if unambiguous

Page 8: Learn Ruby Programming in Amc Square Learning

Input and Output - tsv filesf = File.open ARGV[0]

while ! f.eof?

line = f.gets

if line =~ /^#/

next

elsif line =~ /^\s*$/

next

else

puts line

end

end

f.close

ARGV is a special array holding the command-line tokens

Gets a lineIf it’s not a comment or a

blank linePrint it

Page 9: Learn Ruby Programming in Amc Square Learning

Processing TSV filesh = Hash.newf = File.open ARGV[0]while ! f.eof? line = f.gets.chomp if line =~ /^\#/ next elsif line =~ /^\s*$/ next else tokens = line.split /\t/ h[tokens[2]] = tokens[1] endendf.close

keys = h.keys.sort {|a,b| a <=> b}keys.each {|k| puts "#{k}\t#{h[k]}" }

Declare a hash tableGet lines without \n or \r\n - chompsplit lines into fields delimited with tabsStore some data from each field into the

hash

Sort the keys - sort method takes a block of code as input

each creates an iterator in which k is set to a value at each pass

#{…} outputs the evaluated expression in the double quoted string

Page 10: Learn Ruby Programming in Amc Square Learning

Blocks

• Allow passing chunks of code in to methods• Receiving method uses “yield” command to call

passed code (can call yield multiple times)

• Single line blocks enclosed in {}• Multi-line blocks enclosed in do…end

• Can use parameters[ 1, 3, 4, 7, 9 ].each {|i| puts i }Keys = h.keys.sort {|a,b| a <=> b }

Page 11: Learn Ruby Programming in Amc Square Learning

Running system commandsrequire 'find'

Find.find('.') do

|filename|

if filename =~ /\.txt$/i

url_output =

filename.gsub(/\.txt$/i, ".html")

url = `cat #{filename}`.chomp

cmd = "curl #{url} -o #{url_output}";

puts cmd

`#{cmd}`

end

end

• require reads in another ruby file - in this case a module called Find

• Find returns an array, we create an iterator filename to go thru its instances

• We create a new variable to hold a new filename with the same base but different .html extension

• We use backticks `` to run a system command and (optionally) save the output into a variable

• curl is a command in mac os to retrieve a URL to a file, like wget in unix

Page 12: Learn Ruby Programming in Amc Square Learning

CGI examplerequire 'cgi'

cgi = CGI.new("html3")size = cgi.params.size

if size > 0 # processing form in = cgi.params['t'].first.untaint cgi.out { cgi.html { cgi.head cgi.body { "Welcome, #{in}!" } } }else puts <<FORMContent-type: text/html

<HTML><BODY><FORM>Enter your name: <INPUT TYPE=TEXTNAME=t><INPUT TYPE=SUBMIT></FORM></BODY></HTML>FORMend

• CGI requires library• Create CGI object

• If parameters passed • Process variable t• untaint variables if using

them in commands

• No parameters?• create form using here

document “<<“

Page 13: Learn Ruby Programming in Amc Square Learning

Reflection

...to examine aspects of the program from within the program itself.

#print out all of the objects in our systemObjectSpace.each_object(Class) {|c| puts c}

#Get all the methods on an object“Some String”.methods

#see if an object responds to a certain methodobj.respond_to?(:length)

#see if an object is a typeobj.kind_of?(Numeric)obj.instance_of?(FixNum)

Page 14: Learn Ruby Programming in Amc Square Learning

Thank You


Top Related