如何重新创建任何? Ruby 中的方法

How to recreate the any? method in Ruby

我正在尝试在 Ruby 中重新创建可枚举模块。我能做到吗?方法并且难以返回 true 或 false。相反,每个数组项都是 1 乘 1 返回的。这是我的代码:

def my_any?
  return self.to enum unless block_given?
  self.each do |i|
    return true if i == yield(i)
  end
end

nums = [3,5,7,3,6,10,20,16]

puts nums.my_any?{|x|x==6}

我哪里出错了?

您有两个问题:

  1. 如果循环找不到匹配项,您将缺少 return false。当前,当它无法匹配时,它将给出 each 的 return 值,这就是您所看到的。
  2. 它目前总是失败,因为虽然您的 return true if cond 构造是正确的,但 any? 的条件不是 i == yield(i):您进行了太多比较。你只需要 yield(i).

to enum 位听起来也有问题,但这与您的问题无关。)

将这些更改放入您的代码中:

def my_any?
  # FIXME: return self.to enum unless block_given?
  self.each do |i|
    return true if yield i
  end
  false
end

您的代码存在三个问题:您应该 return 在无阻塞调用时为该方法设置一个枚举器,您应该检查 yield return 是什么,并且您应该显式 return false 失败:

def my_any?
  return to_enum(:my_any?) unless block_given?
  each { |i| return true if yield(i) }
  false
end

nums = [3,5,7,3,6,10,20,16]

puts nums.my_any? { |x| x == 6 }
#⇒ true
lazy = nums.my_any?
lazy.each { |x| x == 6 }
#⇒ true

或者,我最好使用 break:

def my_any?
  return to_enum(:my_any?) unless block_given?

  each { |i| break true if yield(i) } == true
end