Ruby 1.9 の新機能もうひとめぐり (中編)

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 をつけなくても警告が出ていた、ような気がする。