-2

この簡単な演習でコードブロックとイテレータを理解しようとしていますが、理解できない括弧を使用して問題に遭遇しました。

「my_times」メソッドがあります

class Integer
    def my_times
        c = 0
        until c == self
            yield(c)        # passes 'c' to code block
            c += 1
        end
        self        # return self 
    end
end
5.my_times {|i| puts "i'm on MY iteration #{i}"}

これは正常に動作し、正常に動作する「my_each2」があります

class Array
    def my_each2
        size.my_times do |i|     # <-- do signifies a code block correct? 'end' is unnecessary?
            yield self[i]
        end
        self
    end
end
array.my_each2 {|e| puts "MY2 block just got handed #{e}"}

私の理解から「do |i|」"size.my_times do |i|" で コード ブロック ('end' のないもの) は正しいですか?
もしそうなら、'do' を使用する代わりに {brackets} に入れようとするとエラーが発生するのはなぜですか?

class Array
    def my_each3
        size.my_times {|i| puts "i'm on MY iteration #{i}"} # <-- error here
            yield(self[i])
        end
        self
    end
end
array.my_each3 {|e| puts "MY3 block just got handed #{e}"}

しかし、「do」を使用すると機能します

size.my_times do |i| puts "i'm on MY iteration #{i}"
4

2 に答える 2

-1

'do |i|' "size.my_times do |i|" で コード ブロック ('end' のないもの) は正しいですか?

いいえそうではありません。do ... endコードブロックです。

もしそうなら、'do' を使用する代わりに {brackets} に入れようとするとエラーが発生するのはなぜですか?

条件が満たされないので、質問は自明に満たされます。

于 2013-05-13T03:40:27.830 に答える
-2

'do |i|' IS はコード ブロックであり、'end' はそれから数行下にあります。

完全なブロックは

size.my_times do |i|     
    yield self[i]
end

したがって、正しい括弧付きバージョンは

size.my_times { |i|  yield(self[i]) }

OK、先に進みましょう。ここには何もありません:p

于 2013-05-13T04:51:23.873 に答える