我对代码很新,我对Ruby条件有一个快速的问题,特别是Case表达式。我有一个方法,如果字符串长度是奇数,我想返回字符串“odd”,如果字符串长度是偶数,我想返回“even”。
我知道简单的东西,我可以使用if / else条件获得结果,但case表达式只返回'nil'。任何帮助将不胜感激。
def odd_or_even(string)
case string
when string.length.even? then "even"
when string.length.odd? then "odd"
end
end
odd_or_even("Ruby") # Wanting to return even rather than nil
odd_or_even("Rails") # Wanting to return odd rather than nil
答案 0 :(得分:5)
您已将case
声明写错了。它有两种形式,与其他语言相比是不寻常的。第一种形式采用参数,并将该参数与所有可能的情况进行比较。第二种形式没有参数,每种情况都是独立评估的。
最小的修复是:
def odd_or_even(string)
case
when string.length.even? then "even"
when string.length.odd? then "odd"
end
end
这是因为在使用参数" Ruby":
调用时,您的代码看起来像这样。def odd_or_even(string)
case string
when true then "even"
when false then "odd"
end
end
您的string
值与true
或false
不匹配,因此您从不匹配的情况中获得nil
。
您可以大大清理代码。考虑一下:甚至和都不奇怪?不是真的:
def odd_or_even(string)
string.length.even? ? 'even' : 'odd'
end
答案 1 :(得分:0)
case something
when condition1
expression1
when condition2
expression2
else
default_expression
end
相当于
if condition1 === something
expression1
elsif condition2 === something
expression2
else
default_expression
end
请注意,case-when
内部使用===
,这是一个可以覆盖的运算符(方法)。