Ruby条件/案例表达

时间:2016-09-23 19:42:59

标签: ruby conditional

我对代码很新,我对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

2 个答案:

答案 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值与truefalse不匹配,因此您从不匹配的情况中获得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内部使用===,这是一个可以覆盖的运算符(方法)。