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