是否有倒“成员?”红宝石的方法?

时间:2011-11-15 08:26:50

标签: ruby enumerable

我经常发现自己检查某些值是否属于某个集合。据我所知,人们通常使用Enumerable#member?对此。

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

然而,这感觉不如Ruby中的大多数东西那么优雅。我宁愿把这段代码写成

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

但我找不到这样的方法。它甚至存在吗?如果没有,任何想法为什么?

5 个答案:

答案 0 :(得分:16)

不是红宝石,而是in ActiveSupport

characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true

答案 1 :(得分:10)

您可以沿着这条线轻松定义它:

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

答案 2 :(得分:1)

不是您的问题的答案,但可能是您的问题的解决方案。

word是一个字符串,不是吗?

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

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

end_index = word.match(/\A[\.,]/)  ? -3 : -2

答案 3 :(得分:1)

在您的具体情况下,end_with?有多个参数。

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

答案 4 :(得分:0)

除非您正在处理对===类似模块,正则表达式等具有特殊含义的元素,否则您可以使用case做得非常好。

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