测试变量是否等于两个值中的任何一个

时间:2010-02-03 23:53:46

标签: ruby

我想测试a是否等于1 2

我能做到

a == 1 || a == 2

但这需要重复a(这对于较长的变量会很烦)

我想做a == (1 || 2)之类的事情,但显然这不起作用

我可以做[1, 2].include?(a),这不错,但让我觉得难以阅读

只是想知道如何使用惯用的红宝石

8 个答案:

答案 0 :(得分:37)

你的第一种方法是惯用的Ruby。不幸的是,Ruby没有相应的Python a in [1,2],我认为这会更好。你[1,2].include? a是最接近的选择,我认为从最自然的方式来看,它有点落后。

当然,如果你经常使用它,你可以这样做:

class Object
  def member_of? container
    container.include? self
  end
end

然后你可以a.member_of? [1, 2]

答案 1 :(得分:11)

我不知道你在什么情况下使用它,但是如果它适合于switch语句,你可以这样做:

a = 1
case a
when 1, 2
  puts a
end

其他一些好处是,当使用case equality ===运算符时,如果需要,可以为不同的行为覆盖该方法。另一个是,如果符合您的使用案例,您也可以使用范围:

when 1..5, 7, 10

答案 2 :(得分:8)

一种方法是请求“Matz”将此功能添加到Ruby规范中。

if input == ("quit","exit","close","cancel") then
  #quit the program
end

但是case-when语句已经让你做到了这一点:

case input when "quit","exit","close","cancel" then 
  #quit the program
end

当写在这样的一行上时,它起作用,几乎看起来像一个if语句。最底层的例子是顶级例子的一个很好的临时替代吗?你是法官。

答案 3 :(得分:5)

首先把它放在某个地方:

class Either < Array
  def ==(other)
    self.include? other
  end
end

def either(*these)
  Either[*these]
end

然后,然后:

if (either 1, 2) == a
  puts "(i'm just having fun)"
end

答案 4 :(得分:5)

你可以使用像

这样的交集
([a] & [1,2]).present?

另一种方式。

答案 5 :(得分:3)

a.to_s()=~/^(1|2)$/

答案 6 :(得分:0)

也许我在这里很厚,但在我看来:

(1..2) === a

...作品。

答案 7 :(得分:0)

Include 绝对是去这里的方法。 ?

  %w[cat dog].include?(type)