«前の日記(2010年05月10日) 最新 次の日記(2010年06月16日)» 編集

Matzにっき


2010年06月15日 [長年日記]

_ [Ruby] Ruby2.0の新機能(かもしれないもの)(1) argument delegation

ひさしぶりのポスト。

なんだか1.9.2のリリースが現実的になってきて、 長い長いRuby2.0のためのモラトリアム期間も終了の気配。 そろそろ真面目に2.0について考えねばならないかも。

いや、考えてきてたのだよ、実際。そこで少しずつリークしておくことにしよう。 私が、万が一にもトラックにはねられた時のためにも。

注意。このエントリはRuby 2.0に入るかもしれない機能について述べていますが、本機能が本当に2.0に採用されるかどうかは、未定です。

Rubyのブロックは「暗黙の引数」なので、通常の引数リストに入らない。 ので、あるメソッドが受けとった引数を他のメソッドにすべて引き渡す時、

def bar(*args)
  foo(*args)
end

とやってもブロックが渡らなくて悲しい、ということになる。正確には

def bar(*args, &blk)
  foo(*args, &blk)
end

としなければならない。が、考えてみると「引数を全部渡したい」というひとつのコンセプトを実現するために、複数の「もの」を渡さねばならないのはめんどくさい。

もっとも、いちばんひんぱんに発生しそうなスーパークラスのメソッドの呼び出しについては、

super

と呼べば、全部渡ることになっているので、問題は少ないのだが。

というわけで、「メソッド引数を全部渡す」文法を追加することを漠然と考えている。

文法はこんな感じ。

def bar(*args)
  foo(...)
end

つまり「...」のみが引数に登場した時には、それは「渡された引数を(ブロックも含めて)全部転送」という意味に解釈しようということだ。あるいは、

def bar(*args)
  foo(:bar, ...)
end

のように、先頭に引数を追加することができてもよいかもしれないが、 たぶん、それはやりすぎだろう。

それから、今までのsuperは

super(...)

の省略形であると解釈する。

実装は、現状のsuperの引数渡しの部分をそのまま流用すればよいはずだから、そんなに難しくないはず。


«前の日記(2010年05月10日) 最新 次の日記(2010年06月16日)» 編集