From: Yukihiro Matsumoto Date: 2007-12-24T04:03:10+09:00 Subject: [ruby-dev:32692] Re: Why only inject() accepts :symbols as if it's a Proc in Enumerable? まつもと ゆきひろです In message "Re: [ruby-dev:32691] Why only inject() accepts :symbols as if it's a Proc in Enumerable?" on Mon, 24 Dec 2007 02:53:00 +0900, Tadashi Saito writes: |その後ソースを斜め読みしたのですが、どうもEnumerableの中では |inject(reduce)のみが | |「ブロックが与えられず、かつ引数にSymbolを指定した場合、 | SymbolをProcとして見る(というか、そのままfuncall()する)」 | |という仕様であるようです。 | |1.8では当然無効であるのは確認したのですが、上記は意図的なものでしょう |か。またどのような設計上の理由があるのでしょうか。 意図的なものです。injectの意図「要素の間に演算(子)を差し込む」 をより直接的に表現しようというものです。 |対称性にはそこまでこだわってもいいことばかりではない、というのは同意しま |すが、特別な理由が無い限りはとりあえず揃えておいた方が、つまりは | | (1..10).inject(&:+) | |と明示的に&でSymbol#to_procを呼び出すようユーザに要求した方が良いと思う |のですが、どうでしょうか。 mapに引数としてシンボルを与えても、injectほど「意図通り」と いう印象を与えないので保留しています。将来そういう判断をしな い保証はないですが。 |# でないと、極端な例ですが「initialがSymbolであるinjectの |# Enumerator」を作れない、という例外ができる気がします それは確かですが、実用上問題ないので放置してもかまわないと思 います。 まつもと ゆきひろ /:|)