= OSCON 2008, Session 8: Ruby 1.9: What to Expect == Major features - Performance, factor of 3 improvement in some cases - Real threads! Also, fibers - Encoding support for character sets - *gems* is built-in (mostly) - no contribs === One lesson - if String.method_defined(:encode) for instance allows you to make code that works in all major Ruby versions. Brilliant === CI Efforts - He took a bunch of libraries and got them to work in 1.9 == What's Changed? === Single character strings are strings! Ruby 1.9: ?c => "c" Ruby 1.8.x: ?c => 99 === String array access Ruby 1.9: "cat"[1] => a Ruby 1.8.x: "cat"[1] => 99 === Hash issues {1,2} is now valid, not T_ASSOC error === String to_s [1,2,3].to_s => "[1, 2, 3]" [1,2,3].to_s => 123 === Colon is not longer valid in when statements Ruby 1.9: case 'a'; when /a/: puts 'word'; end => SyntaxError === Dummy variables are not modified in scope Ruby 1.9: i=0; [1,2,3].each{|i|}; puts i => 0 It still happens when you do a for loop, which is debatable. === to_sym for integers - 5.to_sym doesn't work anymore - But, you can use "5".to_sym - rake breaks on the [] function! === Hash Keys "unordered" Ruby 1.8.x: {:a=>"a", :b=>"b", :c=>"c"} => {:a=>"a", :c=>"c", :b=>"b"} Ruby 1.9: {:a=>"a", :b=>"b", :c=>"c"} => {:a=>"a", :b=>"b", :c=>"c"} - Insertion order is guaranteed apparently === Stricter unicode regex Ruby 1.9: /\x80/u => SyntaxError - TR and Regexp are now unicode === BasicObject - You have to put :: in front of things now inside classes inherited from BasicObject === $KCODE produces warnings === Instance methods are now arrays of symbols Ruby 1.9: {}.methods.sort.last => :zip Ruby 1.8.x: {}.methods.sort.last => "zip" === encoding: - You can define encoding at the top of your source file === Real threading - Race conditions - Assumptions === Implications - Changes are straightforward - Cumulative effect is massive - Lots of gems are non-maintained, 1.9 breaks them. Who fixes them? === Recommendations - Make gems that work with 1.8.x and 1.9 - use git - to_enum === Lambda shorthand Ruby 1.9: p = -> a,b,c {a+b+c} puts p.[1,2,3] === Complex is builtin Ruby 1.9: Complex(3,4) = 3 + 4.im === Splat in the middle def foo(first *middle, last) == Fibers - No blocking IO - Lightweight threads - Does the equivalent of co-routines == When you break, you can choose what to return break line if line.match('foo') == "nested" methods class F def foo def foo "subsequent" end "first" end end f = F.new f.foo => "first" f.foo => "subsequent"