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

Tom*_*man 56 ruby

我想测试是a等于1 还是 2

我可以

a == 1 || a == 2
Run Code Online (Sandbox Code Playgroud)

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

我想做类似的事情a == (1 || 2),但显然这不会奏效

我能做到[1, 2].include?(a),这并不坏,但让我觉得有点难以阅读

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

Pet*_*ter 38

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

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

class Object
  def member_of? container
    container.include? self
  end
end
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么不将`member_of?`重命名为`in?`? (3认同)

Jac*_*Chu 11

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

a = 1
case a
when 1, 2
  puts a
end
Run Code Online (Sandbox Code Playgroud)

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

when 1..5, 7, 10
Run Code Online (Sandbox Code Playgroud)


Arc*_*lye 8

一种方法是请求"Matz"将此功能添加到Ruby规范中.

if input == ("quit","exit","close","cancel") then
  #quit the program
end
Run Code Online (Sandbox Code Playgroud)

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

case input when "quit","exit","close","cancel" then 
  #quit the program
end
Run Code Online (Sandbox Code Playgroud)

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

  • 就个人而言,我不喜欢使用`if input ==("quit","exit"...)`的想法,因为它在测试数组相等性时非常糟糕.使用`case ... when ...`更好,因为它是有效的语法,虽然它有点出乎意料.我认为使用"in"运算符来测试包含在数组中,如其他响应中所提到的,将是该语言的一个很好的补充. (2认同)

Jer*_*ten 6

首先把它放在某个地方:

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

def either(*these)
  Either[*these]
end
Run Code Online (Sandbox Code Playgroud)

然后,然后:

if (either 1, 2) == a
  puts "(i'm just having fun)"
end
Run Code Online (Sandbox Code Playgroud)


Gou*_*rav 5

你可以像使用交叉点一样

([a] & [1,2]).present?
Run Code Online (Sandbox Code Playgroud)

另一种方式.