如何重新创建任何? 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}
我哪里出错了?
您有两个问题:
- 如果循环找不到匹配项,您将缺少
return false
。当前,当它无法匹配时,它将给出 each
的 return 值,这就是您所看到的。
- 它目前总是失败,因为虽然您的
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
我正在尝试在 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}
我哪里出错了?
您有两个问题:
- 如果循环找不到匹配项,您将缺少
return false
。当前,当它无法匹配时,它将给出each
的 return 值,这就是您所看到的。 - 它目前总是失败,因为虽然您的
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