Gregory BrownがRuby 1.9の新機能で好きなこと10選。
Enumerator is in core and more tightly integrated
a = 4.times a = a.each a.inject{|s,x| s+x} # => 6
Enumerator#with_index
[1,2,3,4,5,6].map.with_index {|x,i|[2,5].include?(i) ? x : x*2} #=> [2, 4, 3, 8, 10, 6]
Better Array#to_s and Hash#to_s
[1,2,3,4].to_s # => "[1, 2, 3, 4]" {1,2,3,4}.to_s # => "{1=>2, 3=>4}"
Method#receiver and Method#owner
class A; def foo; end end a = A.new a.method(:foo).receiver # => #<A:0xa7c9f6d8> class A; def foo; end end a = A.new a.method(:foo).owner # => A
Process.daemon
Process.daemon() => fixnum Process.daemon(nochdir=nil,noclose=nil) => fixnum
Blocks can take block argument
define_method(:foo){|&b| b.call(bar)}
Block arguments are always local
a = 1 10.times{|a| } # !> shadowing outer local variable - a a # => 1
New literal Hash syntax
{ a: 1, b: 2 } foo(a: 1, b: 2)
BasicObject
BasicObject.instance_methods # => ["__send__", "funcall", "__id__", "==", "send", "respond_to?", "equal?", "object_id"] Object.ancestors # => [Object, Kernel, BasicObject]
ちなみにGregoryが嫌いなことは
a = ->(b,c){ b + c }
だそうだ。これ不評だよねえ。でも、なんでだろう?
私もしばしば経験があるんだけど、 頭の中ではなにもかもうまくいって、「成功間違いなし」とか思っちゃうんだけど、 いざ実践してみると、逆になにもかもがうまくいかないように思えるなんてのは 日常茶飯事だよね。
私の息子は折紙が大好きなんだけど、 折り図を見るとかっこいい作品がイメージできてわくわくしながら 取り掛かるものの、いざ折り始めるとぜんぜんうまくいかなくて がっかりしてしまう(彼はちょっと挫折癖がある)のをしばしば見かける。
ま、親子だから分野は違えど似たような反応をしてしまうわけだな。
しかし、私の方はそのような失敗の経験をはるかに積んでいるために まだ若い息子よりも立ち直りが早いし、そもそも失敗を予測して手当てをすることができるように なっている。
江島さんがリンク先のエントリで書いてることって、 結局はそういうことだよね。やりもしないで「やりさえすれば成功間違いなし」とか 「自分は天才だ」とか思いこんじゃう、ちょっと(だいぶ?)アレな人と 根っこは同じだ。
いや、程度の差こそあれ、人間、誰でもみんなアレなんだよ。 要はそこで(何度も失敗しても、それでもの)一歩踏み出すかどうかが、 違いを生むんじゃないかなあ。
ちなみにRubyは私の最初の言語ではない。