Compleat Rubyist – Day 1
June 19th, 2010 by Brian | Filed under work.Day 1 of 2 of my notes for the Compleat Rubyist training course
Ruby Versions and Implementations – David
http://ruby-versions.net/ – David’s home for ruby versions & implementations for learning & historical reference
Ruby version manager – http://rvm.beginrescueend.com – lets you install several ruby versions/implementations and easily switch between (including your own custom compiled version). Suggestion – don’t install as root, even though it is allowed.
Notes on a few of the existing options:
- MacRuby – interacts with Cocoa
- Rubinius – Ruby in Ruby
- JRuby – Ruby on JVM
- REE – optimized – created by Phusion Passenger team
- MagLev – built in object persistence, repository instead of files, smalltalk-ish
- IronRuby – Ruby on .NET
- URABE – ?
rvm allows you to compare performance between versions/implementation:
rvm ruby-1.8.6,ruby1.9.2 benchmark filename.rb
Why does everyone use 1.8 instead of 1.9?
- Same amount of people are using it as last year (like almost no one)
- Rails considerations
- 1.9 is not 100% backwards compatible
- 1.8.7 backported many of the features of 1.9, so people feel safer
Ruby Enterprise Edition has major memory and speed improvements
Highlights of changes between 1.8 & 1.9
- Enumerators
- Method parameters
- Block variable binding & scope
- Syntax changes
Discussion
- “Ruby 1.9 was plenty different enough to be 2.0″ – David
- 1.9.1 is currently the stable supported version and has been for about a year.
- 1.8.6 to 1.8.7 was a big jump – major backporting of 1.9 features into 1.8
- 1.8.7 was a safe harbor for those that wanted 1.9 features but were scared of 1.9
- rails3 + ruby 1.9.1 = segfaults
… works with certain revisions of 1.9.2 HEAD
Enumerator object – 1.9
- mixes in Enumerable
- you write the ‘each’ method
- borrow from another object (can be lazy)
- or
- pass in code block on instantiation (via a yielder)
- once it knows how to ‘each’, it can do select, map, each_cons ….
- 1.8.6 – require ‘enumerator’ – Enumerable::Enumerator
- 1.9.x – no require needed – promoted to top level ‘Enumerator’
side bar: each_cons vs each_slice
Note to self: I need to memorize each/select/map/collect
What methods do I get with Enumerator that I don’t get with Enumerable (Array)?
Enumerator.instance_methods - Array.instance_methods :with_index, :with_object, :next, :rewind
Method argument semantics
required args can now come after optional args
def m(a, b=1, c)
def m(a, *b, c)
def m((a,b),c)
required arguments get filled first
Block variable scope
- probably the most important/annoying/significant change
- breaks stuff in surprising ways
- but if it does break stuff, you were likely doing something buggy before
Example 1:
a = [1,2,3]
a.each {|x| p x}
x gets value of 3 when you are done
|x| literally assigns x ( |x=…| ), so it becomes available outside the block
Example 2:
a = 1
array.each { a = 2 }
does not change the value of a
- Matz said he wished he had done this from the beginning
- Unifies the parameter syntax between methods & lambas
1.9 Miscellany
- no more String#each
- “Hello”[0] = “H” #in 1.8 it returns 72
- new instance_exec is like instance_eval but takes a param to inject
JRuby – ask David about using ArrayList instead of [] in playpoker.rb
The Testing Landscape
Test::Unit is gone in 1.9
Test::Unit::TestCase -> Mini::Test::TestCase
Mini::Test has a new option: refute_match
require ‘shoulda’ – makes it more like RSpec without going full RSpec
RSpec is the defacto standard for Behavior-driven testing
Jeremy – wrote ‘context’ and ‘match’
Given/When/Then – cucumber is most popular
“Think in units of features rather than units of code” – Gregory
require ‘could’ – another tool – include feature test right in the same file as tests
Test data
- YAML/CSV – hard to maintain, csv is kinda nice because you can open in spreadsheet program (or rather your testers can)
- model_stubbing http://github.com/technoweenie/model_stubbing
- Factories is the new hotness
- FactoryGirl
- Machinist – http://github.com/notahat/machinist
- create shams & blueprints
- “way slower” than fixtures
- mocking/stubbing
- can extend a class to do it
- can use OpenStruct to do it require ‘ostrich’
- Jeremy likes using ‘rr’
- RSpec has it’s own stubbing
- flexmock
- Proxies
- Proxies are like mocks & stubs & real code combined
- Proxies are the Ken Jennings of mocks & stubs
Tags: compleatrubyist, ruby, training

