测试变量是否与if-elsif链长的几个字符串中的任何一个匹配,或者case-when

jpw*_*ynn 16 ruby string comparison

我假设在红宝石中有一个很好的单行方式

if mystr == "abc" or "def " or "ghi" or "xyz"
Run Code Online (Sandbox Code Playgroud)

但在我通常咨询的在线参考文献中找不到如何做到这一点...

谢谢!

Phr*_*ogz 23

也许你不知道你可以在一个案例中加入多个条件:

case mystr
  when "abc", "def", "ghi", "xyz"
    ..
end
Run Code Online (Sandbox Code Playgroud)

但对于这个特定的基于字符串的测试,我会使用正则表达式:

if mystr =~ /\A(?:abc|def|ghi|xyz)\z/
Run Code Online (Sandbox Code Playgroud)

如果您不想构造正则表达式,并且您不想要case语句,则可以创建一个对象数组并使用Array#include?test来查看该对象是否在数组中:

if [a,b,c,d].include?( o )
Run Code Online (Sandbox Code Playgroud)

或者,通过猴子修补Object,您甚至可以将它转过来:

class Object
  def in?( *values )
    values.include?( self )
  end
end

if o.in?( a, b, c, d )
Run Code Online (Sandbox Code Playgroud)

  • 什么dos?:做什么?(谷歌不会让你搜索符号,我查找的三个红宝石/正则表达式指南没有:我可以告诉你) (2认同)
  • 在正则表达式中,您使用括号来限制表达式,并捕获它以供以后使用.在这种情况下,我们实际上并不需要或想要捕获它,因此在括号的开头加上"?:"是一条不捕获它的指令.有关详细信息,请参阅[官方Oniguruma正则表达式语法](http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt). (2认同)

sep*_*p2k 13

你可以Array#include?像这样使用:

if ["abc", "def ", "ghi", "xyz"].include?(mystr)
Run Code Online (Sandbox Code Playgroud)

  • 在这个特定的情况下,我会使用空格分隔的数组文字语法来删除所有的逗号和引号:`%w [abc def ghi xyz] .include?(mystr)` (6认同)