Keith Bennett : What I Love About Ruby

This page last changed on Sep 17, 2008 by kbennett.


What I Love About Ruby
Keith Bennett

kbennett .at. bbsinc .dot. biz




Simplicity of Creating Instance Variables with Accessors and Mutators in Ruby

class Y
  attr_accessor :a
end


...creates an instance variable a, and an accessor and mutator.


Concise Idiom for Conditional (and Lazy) Initialization

@var ||= some_expensive_initialization


...means if var is undefined, define it, and if nil, do the initialization.


Numeric Constants Thousands Separators Supported

irb(main):002:0> 1_000_000
=> 1000000
irb(main):003:0> 1_000_000.class
=> Fixnum


Actually, all underscores are stripped, even if they do not separate thousands.


Shell Integration

A shell command enclosed in backticks will be run, and the value returned by the backticked command
will be the text the command sent to stdout:

irb(main):008:0>         `mkdir a b c d`
=> ""
irb(main):009:0>         `touch b/foo d/foo`
=> ""
irb(main):010:0>         emptydirs = `find . -type d -empty`
=> "./an./cn"
irb(main):011:0>         puts emptydirs
./a
./c
=> nil



Logical Syntax:

1.upto(10) { |i| puts i }

(100..200).each { |n| puts n }




Document generated by Confluence on Sep 18, 2008 09:45                                          Page 1
vs., in Java, for the first example:

for (int i = 0; i <= 10; i++) {
  System.out.println(i) ;
}



Ability to Specify Arrays (and Hashes) as Literals

and the Ease of Iterating Over Them

irb(main):018:0> ['collie', 'labrador', 'husky'].each { |breed|
  puts "Hi, I'm a #{breed}, and I know how to bark."
}
Hi, I'm a collie, and I know how to bark.
Hi, I'm a labrador, and I know how to bark.
Hi, I'm a husky, and I know how to bark.
=> ["collie", "labrador", "husky"]


Also:

%w(collie labrador husky)


can be used to create the array instead of:

['collie', 'labrador', 'husky']


A Hash:



irb(main):063:0> favorites = { :fruit => :durian, :vegetable => :broccoli }
=> {:fruit=>:durian, :vegetable=>:broccoli}



Ranges

water_liquid_range = 32.0...212.0
=> 32.0...212.0
irb(main):010:0> water_liquid_range.include? 40
=> true
irb(main):011:0> water_liquid_range.include? -40
=> false


Note: Ranges are not arrays; any number n, not just integers, such that 32.0 <= n < 212.0, is included
in the range.


Converting Ranges to Arrays:



irb(main):043:0> ('m'..'q').to_a
=> ["m", "n", "o", "p", "q"]



Blocks Used to Automatically Close Resources

File.open 'x.txt', 'w' do |file|
  file << 'Hello, world'




Document generated by Confluence on Sep 18, 2008 09:45                                            Page 2
end


The file is automatically closed after the block completes. If no block is provided, then the open function
returns the file instance:

irb(main):001:0>   f = File.open 'x.txt', 'w'
=> #<File:x.txt>
irb(main):002:0>   f << "Pleaaase, delete me, let me go..."
=> #<File:x.txt>
irb(main):003:0>   f.close
=> nil
irb(main):004:0>   puts IO.read('x.txt')
Pleaaase, delete   me, let me go...
=> nil



Simple File Operations

file_as_lines_array = IO.readlines 'x.txt'
file_as_single_string = IO.read 'x.txt'



Clean and Simple Syntax

puts Array.instance_methods.sort



Regular Expressions

irb(main):027:0>   'ruby' =~ /ruby/
=> 0
irb(main):028:0>   'rubx' =~ /ruby/
=> nil
irb(main):029:0>   'ruby' =~ /Ruby/
=> nil
irb(main):030:0>   'ruby' =~ /Ruby/i
=> 0



Arrays:

irb(main):001:0> nums = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):006:0> nums.include? 3
=> true
irb(main):004:0> nums.collect { |n| n * n }
=> [1, 4, 9, 16, 25]
irb(main):002:0> nums.reject { |n| n % 2 == 0}
=> [1, 3, 5]
irb(main):003:0> nums.inject { |sum,n| sum += n }
=> 15
irb(main):052:0* distances_in_miles = [10, 50]=> [10, 50]
irb(main):053:0> distances_in_km = distances_in_miles.map { |n| n * 9.0 / 5.0 }
=> [18.0, 90.0]irb(main):016:0* twos = (0..10).map { |n| n * 2 }
=> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
irb(main):017:0> fours = (0..5).map { |n| n * 4 }
=> [0, 4, 8, 12, 16, 20]
irb(main):018:0> twos - fours
=> [2, 6, 10, 14, 18]
irb(main):019:0> twos & fours


Document generated by Confluence on Sep 18, 2008 09:45                                                Page 3
=> [0, 4, 8, 12, 16, 20]
irb(main):020:0> fours * 2
=> [0, 4, 8, 12, 16, 20, 0, 4, 8, 12, 16, 20]
irb(main):021:0> twos + fours
=> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 0, 4, 8, 12, 16, 20]



Built-in String Operations

   •   Case Conversions, Capitalization
   •   Left, Right, Sub
   •   Strip, Justify, Center
   •   Search and Replace (gsub)
   •   Insert, Delete




Document generated by Confluence on Sep 18, 2008 09:45            Page 4

اليوم السعيد

  • 1.
    Keith Bennett :What I Love About Ruby This page last changed on Sep 17, 2008 by kbennett. What I Love About Ruby Keith Bennett kbennett .at. bbsinc .dot. biz Simplicity of Creating Instance Variables with Accessors and Mutators in Ruby class Y attr_accessor :a end ...creates an instance variable a, and an accessor and mutator. Concise Idiom for Conditional (and Lazy) Initialization @var ||= some_expensive_initialization ...means if var is undefined, define it, and if nil, do the initialization. Numeric Constants Thousands Separators Supported irb(main):002:0> 1_000_000 => 1000000 irb(main):003:0> 1_000_000.class => Fixnum Actually, all underscores are stripped, even if they do not separate thousands. Shell Integration A shell command enclosed in backticks will be run, and the value returned by the backticked command will be the text the command sent to stdout: irb(main):008:0> `mkdir a b c d` => "" irb(main):009:0> `touch b/foo d/foo` => "" irb(main):010:0> emptydirs = `find . -type d -empty` => "./an./cn" irb(main):011:0> puts emptydirs ./a ./c => nil Logical Syntax: 1.upto(10) { |i| puts i } (100..200).each { |n| puts n } Document generated by Confluence on Sep 18, 2008 09:45 Page 1
  • 2.
    vs., in Java,for the first example: for (int i = 0; i <= 10; i++) { System.out.println(i) ; } Ability to Specify Arrays (and Hashes) as Literals and the Ease of Iterating Over Them irb(main):018:0> ['collie', 'labrador', 'husky'].each { |breed| puts "Hi, I'm a #{breed}, and I know how to bark." } Hi, I'm a collie, and I know how to bark. Hi, I'm a labrador, and I know how to bark. Hi, I'm a husky, and I know how to bark. => ["collie", "labrador", "husky"] Also: %w(collie labrador husky) can be used to create the array instead of: ['collie', 'labrador', 'husky'] A Hash: irb(main):063:0> favorites = { :fruit => :durian, :vegetable => :broccoli } => {:fruit=>:durian, :vegetable=>:broccoli} Ranges water_liquid_range = 32.0...212.0 => 32.0...212.0 irb(main):010:0> water_liquid_range.include? 40 => true irb(main):011:0> water_liquid_range.include? -40 => false Note: Ranges are not arrays; any number n, not just integers, such that 32.0 <= n < 212.0, is included in the range. Converting Ranges to Arrays: irb(main):043:0> ('m'..'q').to_a => ["m", "n", "o", "p", "q"] Blocks Used to Automatically Close Resources File.open 'x.txt', 'w' do |file| file << 'Hello, world' Document generated by Confluence on Sep 18, 2008 09:45 Page 2
  • 3.
    end The file isautomatically closed after the block completes. If no block is provided, then the open function returns the file instance: irb(main):001:0> f = File.open 'x.txt', 'w' => #<File:x.txt> irb(main):002:0> f << "Pleaaase, delete me, let me go..." => #<File:x.txt> irb(main):003:0> f.close => nil irb(main):004:0> puts IO.read('x.txt') Pleaaase, delete me, let me go... => nil Simple File Operations file_as_lines_array = IO.readlines 'x.txt' file_as_single_string = IO.read 'x.txt' Clean and Simple Syntax puts Array.instance_methods.sort Regular Expressions irb(main):027:0> 'ruby' =~ /ruby/ => 0 irb(main):028:0> 'rubx' =~ /ruby/ => nil irb(main):029:0> 'ruby' =~ /Ruby/ => nil irb(main):030:0> 'ruby' =~ /Ruby/i => 0 Arrays: irb(main):001:0> nums = [1,2,3,4,5] => [1, 2, 3, 4, 5] irb(main):006:0> nums.include? 3 => true irb(main):004:0> nums.collect { |n| n * n } => [1, 4, 9, 16, 25] irb(main):002:0> nums.reject { |n| n % 2 == 0} => [1, 3, 5] irb(main):003:0> nums.inject { |sum,n| sum += n } => 15 irb(main):052:0* distances_in_miles = [10, 50]=> [10, 50] irb(main):053:0> distances_in_km = distances_in_miles.map { |n| n * 9.0 / 5.0 } => [18.0, 90.0]irb(main):016:0* twos = (0..10).map { |n| n * 2 } => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] irb(main):017:0> fours = (0..5).map { |n| n * 4 } => [0, 4, 8, 12, 16, 20] irb(main):018:0> twos - fours => [2, 6, 10, 14, 18] irb(main):019:0> twos & fours Document generated by Confluence on Sep 18, 2008 09:45 Page 3
  • 4.
    => [0, 4,8, 12, 16, 20] irb(main):020:0> fours * 2 => [0, 4, 8, 12, 16, 20, 0, 4, 8, 12, 16, 20] irb(main):021:0> twos + fours => [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 0, 4, 8, 12, 16, 20] Built-in String Operations • Case Conversions, Capitalization • Left, Right, Sub • Strip, Justify, Center • Search and Replace (gsub) • Insert, Delete Document generated by Confluence on Sep 18, 2008 09:45 Page 4