[#3536] Re: [ruby-list:10256] Re: for が修飾子だったら — Junichi Kurokawa <jun@...>

Reply-To: ruby-devとしました。

15 messages 1998/10/22

[ruby-dev:3547] call iterator without block (Re: for が修飾子だったら)

From: shugo@... (MAEDA Shugo)
Date: 1998-10-23 09:22:25 UTC
List: ruby-dev #3547
前田です。

In message "[ruby-dev:3540] Re: [ruby-list:10256] Re: for     が修飾子だったら"
Junichi Kurokawa <jun@mew.gol.com> wrote:

|    Y> 「『foo.each;』に意味があるのか」というのは,どういう意味でしょう? 
|    Y> 改善の提案は歓迎しますが,一応,数年来の経験を通じて現在の文法は
|    Y> おおむね良好であるという印象を持っています.いろいろ吟味した結果
|    Y> 今のようになってるわけですし.
|
|foo.each;に何の意味があるんですか。
|
|1. 返り値は。たぶんnil。
|2. 副作用は。たぶん無し。

ひょっとして、

$ ruby -e 'p [].each'

とされて、エラーにならないために、イテレータとしてのeachとは別に
何もしないメソッドとしてeachが定義されていると勘違いされている
のではないでしょうか?

Array#eachはブロックが与えられることが期待されているメソッドで、
その定義は一つしかありません。
Array#eachの定義は、

def each
  for i in 0..self.size-1
    yield(self[i])
  end
end

のようになっています。
# 実際にはCで記述されています。

$ ruby -e 'p [0].each'

のように空でない配列に対してeachを呼び出すと、

/tmp/rba00382:1:in `each': yield called out of iterator (LocalJumpError)
        from /tmp/rba00382:1

のように表示され、ブロックを与えられなかった場合も、ブロックを与えた
場合と同じものが呼ばれていることがわかると思います。

$ ruby -e 'p [].each'

の場合は配列が空なので、yieldが呼ばれないためにエラーが起きないわけです。

-- 
前田 修吾 <shugo@aianet.ne.jp>

In This Thread