Ruby函数不会检测到do ... end blocks

时间:2015-05-27 17:14:05

标签: ruby

让我先说一下我对Ruby的新手。我正在经历几个练习,编写我自己的一些可枚举函数的版本。一切都很好,直到有点停止工作。我认为我没有改变任何东西。我的功能如下:

def my_all?
    return false unless block_given?
    for i in self
        if !yield(i)
            return false
        end
    end
    return true
end

我将其称为如下:

arr = [1,2,3,4]
print arr.my_all? do |num|
    num == num
end

这应该返回true,因为每个num显然等于它自己。但是我得到了错误的返回值。经过一些捣乱后,我发现红宝石没有检测到传递给my_all的do ... end块?方法(block_given?返回false)。如果我将do..end块更改为单行括号块,则该方法可以工作,如下所示:

{ |num| num == num}

有人可以告诉我在do..end版本上我做错了什么吗?感谢

1 个答案:

答案 0 :(得分:0)

您可能希望查看iterators,而不是使用for构造。

所以使用.each看起来像是:

def my_all?
    return false unless block_given?
    self.each do |item|
        unless yield(item)
            return false
        end
    end
    return true
end

我还更改了if ! unless,因为它读得更好(只是不要unless使用else> _<)