我经常需要检查某个值是否属于某个集合。据我所知,人们通常使用 Enumerable#member?
来实现这一点。
end_index = ['.', ','].member?(word[-1]) ? -3 : -2
然而,这种方法似乎不如 Ruby 中的大多数东西那样优雅。我更愿意以以下方式编写代码:
end_index = word[-1].is_in?('.', ',') ? -3 : -2
但我找不到这样的方法。它甚至存在吗?如果不存在,有任何想法原因是什么?
我经常需要检查某个值是否属于某个集合。据我所知,人们通常使用 Enumerable#member?
来实现这一点。
end_index = ['.', ','].member?(word[-1]) ? -3 : -2
然而,这种方法似乎不如 Ruby 中的大多数东西那样优雅。我更愿意以以下方式编写代码:
end_index = word[-1].is_in?('.', ',') ? -3 : -2
但我找不到这样的方法。它甚至存在吗?如果不存在,有任何想法原因是什么?
虽然不是在Ruby中,但在ActiveSupport中有这个功能:
characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => 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
或者定义
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
或者
end_index = word.match(/\A[\.,]/) ? -3 : -2
除非您处理的元素具有 ===
的特殊含义,例如模块、正则表达式等,否则您可以使用 case
。
end_index = case word[-1]; when '.', ','; -3 else -2 end