Рубиновый эквивалент foo в [один, два, три]? - PullRequest
1 голос
/ 30 июля 2010

В Python действительно элегантный синтаксис для проверки значения по нескольким шаблонам.

2 in [1,2,4] #=> True
6 in [1,2,4] #=> False

Порядок в версии Ruby просто кажется неправильным:

[1,2,4].include?(2)

Я понимаю, что include? делаетОО чувства больше чем 2.included_in?([1,2,4]), мне все еще не нравится.В Ruby даже есть ключевое слово in, но, похоже, оно используется только в конструкции for i in [1,2,4], но не для тестов на членство.

Другой способ таков:

(case 2 when 1,2,4 then true end)

Довольно многословно, но позволяеттестирование паттернов:

(case file_name when "README", /\.txt\z/ then true end)

Все еще не очень читабельно.

Я случайно упустил какой-то действительно изящный способ?

Ответы [ 3 ]

7 голосов
/ 30 июля 2010

Как говорит @deceze, вы можете реализовать свои собственные:

class Object
  def in(ar)
    ar.include? self
  end
end

irb(main):013:0> 's'.in ['a', 'b', 'c']
=> false
irb(main):014:0> 's'.in ['a', 'b', 'c', 's']
=> true
irb(main):015:0> 5.0.in [3.2, 5.0, 1.2]
=> true
irb(main):016:0> 4.0.in [3.2, 5.0, 1.2]
=> false
3 голосов
/ 30 июля 2010

Полагаю, что преимущество введения «более распространенного» паттерна не стоило обременять язык новой синтаксической конструкцией с очень специфическим использованием, особенно потому, что использование .include? не является утомительным и нелогичным, когда вы думаете о это.

С другой стороны, что мешает вам реализовать и использовать метод Object#included_in??

2 голосов
/ 03 августа 2010

$ gem install sane

$ irb

 >> 3.in? [1,2,3]
 >> true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...