Я пытаюсь воссоздать перечислимый модуль в Ruby. Я готов к любому? метод и не могу вернуть истину или ложь. Вместо этого каждый элемент массива возвращается 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 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
@Stefan, в нашей скромной жизни всегда есть потребность в self
:)
У вас есть три проблемы с вашим кодом: вы должны вернуть перечислитель для этого метода при вызове без блока, вы должны проверить, что именно возвращает yield
, и вы должны явно вернуть 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
Я не могу сосчитать, когда спрашивающий хотел воссоздать метод Enumerable
, а ответы не учитывались для случая, когда метод не имеет блока и возвращается перечислитель. Приятно видеть, что вы рассмотрели этот очень важный аспект вопроса.
Ой! Enumerable # любой? возвращает только true
или false
, но не перечислитель. Странный. Думаю, можно пожелать написать, например, nums.any?.with_index { |x,i| x <= 6 && i >2 }
.
@CarySwoveland Enumerable#any?
относительно молод, сейчас люди не такие разборчивые :)
Нет необходимости в
self