我正在尝试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
并且离开了这个功能。我甚至将显式的强制转换为字符串。
我如何编写声明以获得有效的评估?
答案 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]
的歧义。目前还不清楚这是否在您的完整代码中表现为错误,但我觉得值得一提。