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.)