Надоело, что в Ruby мы можем проверить, содержит ли массив (или другой Enumerable) значение с помощью метода include?
...
puts %w(one two three four).include?("two")
# => true
puts %w(one two three four).include?("five")
# => false
... но не напрямую проверять, включено ли значение в массив (семантически идентично, но не является частью языка) ...
puts "two".in?( %w(one two three four) )
puts "five".in?( %w(one two three four) )
Я думал, что у обезьяньей заплатки Object
есть удобный Object#in?
метод, похожий на:
class Object
def in?(array)
return false unless array.respond_to?(:include?) # Or perhaps raise an error.
return array.include?(self)
end
end
С этим определением метода на Object
, такие вещи, как
"two".in?( %w(one two three four) )
# => true
:nuts.in?( [:banana, :chocolate, :pie] )
# => false
работают хорошо и очень близки к обычному предложению, выражающему этот тест.
Часто я сталкиваюсь с тем, что if element.in?(array)
является несколько более естественным выражением, чем if array.include?(element)
, особенно если массив включен как литерал (вместо ссылки на переменную).
Вопрос (пренебрегая общим мнением об исправлении обезьян): действительно ли этот пример исправления обезьян умная вещь? Каковы конкретные недостатки использования метода Object#in?
, опять же, не вдаваясь в общие плюсы и минусы объектов исправления обезьян (в Ruby)?