A quick Ruby Tutorial COMP 313 Source Programming
A quick Ruby Tutorial COMP 313 Source: Programming Ruby, The Pragmatic Programmers’ Guide by Dave Thomas, Chad Fowler, and Andy Hunt
Ruby • • Invented by Yukihiro Matsumoto, “Matz” 1995 Fully object-oriented alternative to Perl or Python
How to run • Command line: ruby <file> • Interactive: irb • Resources: – see web page – man ruby
Simple method example def sum (n 1, n 2) n 1 + n 2 end sum( 3 , 4) => 7 sum(“cat”, “dog”) => “catdog” load “fact. rb” fact(10) => 3628800
executable shell script #!/usr/bin/ruby print “hello worldn” or better: #!/usr/bin/env ruby make file executable: chmod +x file. rb
Method calls "gin joint". length → 9 "Rick". index("c") → 2 -1942. abs → 1942 Strings: ‘asn’ => “as\n” x=3 y = “x is #{x}” => “x is 3”
Another method definition def say_goodnight(name) "Good night, #{name}" end puts say_goodnight('Ma') produces: Good night, Ma
Name conventions/rules • local var: start with lowercase or _ • global var: start with $ • instance var: start with @ • class var: start with @@ • class names, constant: start uppercase following: any letter/digit/_ multiwords either _ (instance) or mixed case (class), methods may end in ? , !, =
Naming examples • • • local: name, fish_and_chips, _26 global: $debug, $_, $plan 9 instance: @name, @point_1 class: @@total, @@SINGLE, constant/class: PI, My. Class, Feet. Per. Mile
Arrays and Hashes • indexed collections, grow as needed • array: index/key is 0 -based integer • hash: index/key is any object a = [ 1, 2, “ 3”, “hello”] a[0] => 1 a[2] => “ 3” a[5] => nil (ala null in Java, but proper Object) a[6] = 1 a => [1, 2, “ 3”, “hello”, nil, 1]
Hash examples inst = { “a” => 1, “b” => 2 } inst[“a”] => 1 inst[“c”] => nil inst = Hash. new(0) #explicit new with default 0 instead of nil for empty slots inst[“a”] => 0 inst[“a”] += 1 inst[“a”] => 1
Control: if example if count > 10 puts "Try again" elsif tries == 3 puts "You lose" else puts "Enter a number" end
Control: while example while weight < 100 and num_pallets <= 30 pallet = next_pallet() weight += pallet. weight num_pallets += 1 end
nil is treated as false while line = gets puts line. downcase end
Statement modifiers • useful for single statement if or while • similar to Perl • statement followed by condition: puts "Danger" if radiation > 3000 square = 2 square = square*square while square < 1000
builtin support for Regular expressions /Perl|Python/ matches Perl or Python /ab*c/ matches one a, zero or more bs and one c /ab+c/ matches one a, one or more bs and one c /s/ matches any white space /d/ matches any digit /w/ characters in typical words /. / any character (more later)
more on regexps if line =~ /Perl|Python/ puts "Scripting language mentioned: #{line}" end line. sub(/Perl/, 'Ruby') # replace first 'Perl' with 'Ruby' line. gsub(/Python/, 'Ruby') # replace every 'Python' with 'Ruby’ # replace all occurances of both ‘Perl’ and ‘Python’ with ‘Ruby’ line. gsub(/Perl|Python/, 'Ruby')
Code blocks and yield def call_block puts "Start of method" yield puts "End of method" end call_block { puts "In the block" } Start of method In the block End of method produces:
parameters for yield def call_block yield("hello", 2) end then call_block { | s, n | puts s*n, "n" } hello prints
Code blocks for iteration animals = %w( ant bee cat dog elk ) # create an array # shortcut for animals = {“ant”, ”bee”, ”cat”, ”dog”, ”elk”} animals. each {|animal| puts animal } # iterate produces: ant bee cat dog elk
Implement “each” with “yield” # within class Array. . . def each for every element # <-- not valid Ruby yield(element) end
More iterations [ 'cat', 'dog', 'horse' ]. each {|name| print name, " "} 5. times { print "*" } 3. upto(6) {|i| print i } ('a'. . 'e'). each {|char| print char } [1, 2, 3]. find { |x| x > 1} (1. . . 10). find_all { |x| x < 3}
I/O • puts and print, and C-like printf: printf("Number: %5. 2 f, n. String: %sn", 1. 23, "hello") #produces: Number: 1. 23, String: hello #input line = gets print line
leaving the Perl legacy behind while gets if /Ruby/ print end ARGF. each {|line| print line if line =~ /Ruby/ } print ARGF. grep(/Ruby/)
Classes class Song def initialize(name, artist, duration) @name = name @artist = artist @duration = duration end song = Song. new("Bicylops", "Fleck", 260)
override to_s s. to_s => "#<Song: 0 x 2282 d 0>" class Song def to_s "Song: #@name--#@artist (#@duration)" end s. to_s => "Song: Bicylops--Fleck (260 )”
Some subclass Karaoke. Song < Song def initialize(name, artist, duration, lyrics) super(name, artist, duration) @lyrics = lyrics end song = Karaoke. Song. new("My Way", "Sinatra", 225, "And now, the. . . ") song. to_s → "Song: My Way--Sinatra (225)"
supply to_s for subclass Karaoke. Song < Song # Format as a string by appending lyrics to parent's to_s value. def to_s super + " [#@lyrics]" end song. to_s → "Song: My Way--Sinatra (225) [And now, the. . . ]"
Accessors class Song def name @name end s. name => “My Way” # simpler way to achieve the same class Song attr_reader : name, : artist, : duration end
- Slides: 29