ref: http://gihyo.jp/dev/serial/01/ruby/0003 (Ruby 1.9 の新機能ひとめぐり (中編): 洗練された文法と意味論)
の補足や思うことなど。
ブロックパラメータのスコープがブロックローカルに
要するに「ラムダ式の仮引数みたいになったよ」ということなんですが、これって名前のある話なんですかね。レキシカルスコープとは違うと思うんだけど。
あと -w をつけたときに「warning: shadowing outer local variable」って言われるのは、別に意図的な衝突を探すツールという意味ではなく、悪いスタイルだから直せという意味かもしれません *1 。でもぼくはこれを悪いスタイルだと思わないので、わざとああいう書き方にしてみた。
ブロックとメソッドの仮引数のルールが統一
書きながら調べてて気がついたけど、メソッドの仮引数の中に括弧が書けるようにもなったんですね。なかなか気持ち悪い。
def foo(x, (y, z)) p [x, y, z] end foo([1, 2], [3, 4, 5]) #=> [[1, 2], 3, 4]
関係ないけど、@foo とか仮引数に書きたいんだよなあ。ローカル変数でうけとって、いちいちインスタンス変数に代入していくのがだるい。特に initialize 。
キーワード引数風表記
この記法の問題点として挙げられるのは、値がシンボルになった場合がちょっと気持ち悪いこと。
set_pixel(color: :black, x:40, y:50)
コロンコロン。個人的には許容範囲ですけどね。それより、キーワード引数を受けとる側が素直に書けないことの方が問題。将来的にはなんとかするらしいので期待 (ruby-dev:38062) 。
改行可能な箇所の追加
コロンの前で改行可能になったのは 2ch のレスがきっかけみたいです (ruby-dev:29189) 。だから何というわけじゃないけど。
Haskell 風のリテラルが書けるようにならないかなあ (ruby-core:16240) 。
ラムダ式の別記法
procがProc.newと同じ意味になったという改善もあります(Proc内でreturnした場合の挙動)。
というのは、以下の挙動の違いのこと。
def foo proc { return "a" }.call "b" end def bar Proc.new { return "a" }.call "b" end p foo #=> 1.8 では "b" 、1.9 では "a" p bar #=> 1.8 でも 1.9 でも "a"
ぼくは proc の中で return したことがないので、恩恵も互換性問題も知らない。
*1:その証拠として、かつては -w をつけなくても警告が出ていた、ような気がする。