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
  • 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: , ,

Share Your Thoughts