hank / life
- Source
- Commits
- Network (0)
- Issues (0)
- Downloads (0)
- Wiki (1)
- Graphs
-
Branch:
master
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"
