在Ruby中切换案例

时间:2018-05-13 20:11:15

标签: ruby

我正在尝试case声明。代码如下所示:

def true?(verbosity)
  verb = verbosity.to_s
  case verb
  when verb.match?('yes')
    true
  when verb.match?('y')
    return true
  when verb.match('ja')
    true
  when verb.match?('j')
    true
  when verb.to_i(10).eql?(1)
    true
  else
    false
  end
end

无论我在case语句中写了什么,即使调试器说options[:verbosity]"yes"case语句也会立即跳转到false并且离开了这个功能。我甚至将显式的强制转换为字符串。 我如何编写声明以获得有效的评估?

2 个答案:

答案 0 :(得分:4)

在此表单中,如果您想分别评估所有case条件,则应在开头省略verb,如下所示:

case
when verb.match?('yes')
  true
when verb.match?('ja')
  true
# ...

那说,如果你使用正则表达式魔法使这整个方法更短,你认为它会更容易阅读和更好吗?我想到这样的事情:

def true?(verbosity)
  verb = verbosity.to_s
  verb.match?(/yes|y|ja|j/i) || verb.to_i.eql?(1)
end

答案 1 :(得分:3)

这是一个直接修复:

def true?(verbosity)
  verb = verbosity.to_s
  # If you wish to reference `verb` below in the branches like this,
  # then DON'T make it the subject of the `case` statement:
  case
  when verb.match?('yes')
    true
  when verb.match?('y')
    return true
  when verb.match('ja')
    true
  when verb.match?('j')
    true
  when verb.to_i(10).eql?(1)
    true
  else
    false
  end
end

或者,这里更清楚地使用case语句(不改变上述任何行为):

def true?(verbosity)
  case verbosity.to_s
  when /yes/, /y/, /ja/, '1'
    true
  else
    false
  end
end

...但是这并不是你想要的,因为它会返回true例如{1}}。 "黄色",但false例如" TRUE&#34 ;.那么,怎么样:

def true?(verbosity)
  case verbosity.to_s
  when /\A(yes|y|ja|1)\z/i
    true
  else
    false
  end
end

..但是在这一点上,你可能在想 - 为什么要在这里打扰case声明?另一个答案已经说明了如何通过删除case语句来更进一步;或者你甚至可以在一行中没有正则表达式执行此操作:

def true?(verbosity)
  %w[yes y ja j 1].include?(verbosity.to_s.downcase)
end

此外,我注意到您的帖子中存在一些关于此参数是应该被称为options[:verbose]还是options[:verbosity]的歧义。目前还不清楚这是否在您的完整代码中表现为错误,但我觉得值得一提。