The document summarizes what Keith Bennett loves about the Ruby programming language. It highlights several key features including the simplicity of creating accessors and mutators for instance variables, concise syntax for conditional initialization, ability to specify arrays and hashes as literals, built-in support for regular expressions, and clean syntax for common string operations. The document provides examples of how these features can be used in Ruby.
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 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