Jay McGavren's Journal

2009-05-06

Notes from RailsConf - Getting to Know Ruby 1.9...

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.)
comments powered by Disqus