Hosted by David A. Black
1.8.6:
> Object.new.to_a
[#<Object...>]
> "onentwonthree".to_a
["onen", "twon",...]
1.9:
> (0..10).to_a
[1, 2, ...]
Above 1.8 items don't have .to_a, though. After all, why *should* an object know how to wrap itself in an array?
> Array(Object.new) #Array now has the responsibility.
[#<Object...>]
1.9:
> "abc".to_i
0
> Integer("abc")
Exception
1.8:
> {1, 2, 3, 4}
Hash
1.9:
> {1 =>2, 3 => 4}
Have to use hash rockets.
1.8:
> String.ancestors
[Enumerable, String, Comparable, ...]
> "1n2n3".each{|s| puts s}
1
2
3
> "abcndefnghi".map {|s| s.reverse }
1.9:
String does not mix in Enumerable
> "".each
NoMethodError...
> "abcndefnghi".lines.each {|l| puts l.upcase}
> "abcndefnghi".each_line {|l| puts l.upcase} #Equivalent
> "abcndefnghi".bytes.each {|l| puts l.upcase}
> "abcndefnghi".code_points.each {|l| puts l}
1.9:
> str = "Give me 100u20ac"
"Give me 100<Euro symbol>"
> str.bytes.to_a.size
14
> str.chars.to_a.size #Shorter than .bytes due to Unicode character.
12
1.8:
> str = "This isna three-nline string"
str[6] #Gives the ordinal. (Kinda hacky...)
115
> str[6, 1]
"s"
1.9:
> str = "Give me 100u20ac"
> str[2] #Gives the character (I like this better).
"v"
> str[2].ord
118
> str[2, 1]
"v"
> str[2, 5]
"ve me"
1.9:
> h = {:one => 1, :two => 2}
> h = {one: 1, two: 2, three: 3} #New hash separator!
1.9:
> link_to "click", controller: "users" #That's a hash as the last argument, braces are optional.
1.8:
> {1 => 2, 3 => 4, 5 => 6} #Non-deterministic, could give {5 => 6, 3 => 4}
1.9:
> {5: 6, 1: 2}.each {|k, v| p "#{k}: #{v}"} #Order is deterministic.
5: 6
1: 2
1.9:
Beware: Hash#sort still returns an Array of Arrays, not a re-ordered Hash. That may change.
Hash#select still returns a Hash.
1.9:
Enumerable module has new methods.
> a = (1 .. 10).to_a
> a.each_slice(3) {|slice| p slice}
[1, 2, 3]
[4, 5, 6]
...
[10]
1.9:
> a.each_cons(3) {|cons| p cons} #Moves result start by 1 index each time.
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
1.9:
> a.one? {|i| i == 2}
false
> a.all? {|i| i == 2}
false
> a.any? {|i| i == 2}
true
1.9:
> ('a'..'c').cycle(2)
#<Enumerator>
> ('a'..'c').cycle(2).to_a
['a', 'b', 'c', 'a', 'b', 'c']
.cycle with no args loops forever. Fun, but dangerous.
1.8:
> x = 1
> [10, 20, 30].each {|x| puts x * 100}
1000
2000
3000
> x == 30
true #WTF? Why not 1? Wasn't x in the block scoped only to the block?
> [10, 20, 30].each {|@var| puts @var}
10
20
30
> @var
30
1.9:
> x = 1
> [10, 20, 30].each {|x| puts x * 100}
1000
2000
3000
> x
1 #There we go, it wasn't overwritten.
[1, 2, 3].each {|@x|}
SyntaxError: formal argument cannot be an instance variable. (That's a good thing to me.)