Ruby,代码块括号错误

时间:2013-05-13 03:33:44

标签: ruby iterator codeblocks

所以我试图通过这个简单的练习来理解代码块和迭代器,并使用我不理解的括号遇到了问题。

我有'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 |”是一个代码块(没有'结束'?)正确?
如果是这样,那么为什么我试图将它放在{方括号}而不是使用'do'时会出错?

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}"

2 个答案:

答案 0 :(得分:-1)

  

'do | i |'在“size.my_times do | i |”是一个代码块(没有'结束'?)正确吗?

不,不是。 do ... end是代码块。

  

如果是这样,那么为什么我试图将它放在{方括号}而不是使用'do'时会出错?

由于条件不满意,这个问题很平常。

答案 1 :(得分:-2)

'do | i |'是一个代码块,'end'是它的几行。

完整的块是

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

所以正确的括号内版本是

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

好的继续,没有什么可看的:p