是否存在一个逆';成员?';ruby中的方法?

是否存在一个逆';成员?';ruby中的方法?,ruby,enumerable,Ruby,Enumerable,我经常检查某个值是否属于某个集合。据我所知,人们通常使用Enumerable#member?来实现此目的 end_index = ['.', ','].member?(word[-1]) ? -3 : -2 然而,这感觉比Ruby中的大多数东西都不那么优雅。我宁愿把这段代码写成 end_index = word[-1].is_in?('.', ',') ? -3 : -2 但我没有找到这样的方法。它真的存在吗?如果没有,有什么想法来解释原因吗?不是用ruby,而是: 您可以通过以下方式轻松定

我经常检查某个值是否属于某个集合。据我所知,人们通常使用
Enumerable#member?
来实现此目的

end_index = ['.', ','].member?(word[-1]) ? -3 : -2
然而,这感觉比Ruby中的大多数东西都不那么优雅。我宁愿把这段代码写成

end_index = word[-1].is_in?('.', ',') ? -3 : -2
但我没有找到这样的方法。它真的存在吗?如果没有,有什么想法来解释原因吗?

不是用ruby,而是:


您可以通过以下方式轻松定义它:

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

不是你问题的答案,而是你问题的解决方案

word是一个字符串,不是吗

您可以使用正则表达式检查:

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


在您的特定情况下,有一个,它接受多个参数

"Hello.".end_with?(',', '.') #=> true

除非处理对
==
有特殊意义的元素,如模块、正则表达式等,否则可以很好地处理
case

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

您还可以为成员使用别名?方法:包括?。这在你的上下文中可能会更好:['.','.].包括?(单词[-1])。@Alex谢谢,我差点忘了。看,是的,我知道我可以。但我不希望将此代码拖到每个新项目中。:-)@Sergei Tulentsev:选择权在你。那就把它放在宝石或其他东西里吧。是的,这会解决这个问题,但还有很多其他的问题,比如[:admin,:版主]。include?(当前用户。角色)这个问题是关于一般情况的,我只是在代码中粘贴了最近发生的事情。但是谢谢你的提示,我不知道这个方法。
"Hello.".end_with?(',', '.') #=> true
end_index = case word[-1]; when '.', ','; -3 else -2 end