I Love Ruby

4
Document generated by Confluence on Sep 18, 2008 09:45 Page 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` => "./a\n./c\n" irb(main):011:0> puts emptydirs ./a ./c => nil Logical Syntax: 1.upto(10) { |i| puts i } (100..200).each { |n| puts n }

Transcript of I Love Ruby

Page 1: I Love Ruby

Document generated by Confluence on Sep 18, 2008 09:45 Page 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 :aend

...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=> 1000000irb(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 commandwill 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`=> "./a\n./c\n"irb(main):011:0> puts emptydirs./a./c=> nil

Logical Syntax:

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

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

Page 2: I Love Ruby

Document generated by Confluence on Sep 18, 2008 09:45 Page 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.0irb(main):010:0> water_liquid_range.include? 40=> trueirb(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 includedin 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'

Page 3: I Love Ruby

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

end

The file is automatically closed after the block completes. If no block is provided, then the open functionreturns 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=> nilirb(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/=> 0irb(main):028:0> 'rubx' =~ /ruby/=> nilirb(main):029:0> 'ruby' =~ /Ruby/=> nilirb(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=> trueirb(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 }=> 15irb(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

Page 4: I Love Ruby

Document generated by Confluence on Sep 18, 2008 09:45 Page 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