Есть ли обратный член?метод в рубине? - PullRequest
9 голосов
/ 15 ноября 2011

Я часто проверяю, относится ли какое-либо значение к какому-либо набору. Как я понимаю, люди обычно используют Enumerable#member? для этого.

end_index = ['.', ','].member?(word[-1]) ? -3 : -2

Тем не менее, это выглядит немного менее элегантно, чем большинство вещей в Ruby. Я бы лучше написал этот код как

end_index = word[-1].is_in?('.', ',') ? -3 : -2

но я не могу найти такой метод. Это вообще существует? Если нет, то есть идеи, почему?

Ответы [ 5 ]

16 голосов
/ 15 ноября 2011

Не в рубине, а в ActiveSupport :

characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true
10 голосов
/ 15 ноября 2011

Вы можете легко определить его следующим образом:

class Object
  def is_in? set
    set.include? self
  end
end

и затем использовать как

8.is_in? [0, 9, 15]   # false
8.is_in? [0, 8, 15]   # true

или определить

class Object
  def is_in? *set
    set.include? self
  end
end

и использовать как

8.is_in?(0, 9, 15)   # false
8.is_in?(0, 8, 15)   # true
1 голос
/ 15 ноября 2011

В вашем конкретном случае есть end_with? , который принимает несколько аргументов.

"Hello.".end_with?(',', '.') #=> true
1 голос
/ 15 ноября 2011

Не ответ на ваш вопрос, но, возможно, решение вашей проблемы.

word - это строка, не правда ли?

Вы можете проверить с помощью регулярного выражения:

end_index = word =~ /\A[\.,]/  ? -3 : -2

или

end_index = word.match(/\A[\.,]/)  ? -3 : -2
0 голосов
/ 06 февраля 2013

Если вы не имеете дело с элементами, которые имеют особое значение для ===, такими как модули, регулярные выражения и т. Д., Вы можете очень хорошо справиться с case.

end_index = case word[-1]; when '.', ','; -3 else -2 end
...