2

我的方法exist­s_else有两个参数:basefallback. 如果basenil,则返回fallback。如果不是nil,则返回base。调用exist­s_else(true, false)应该返回true

如果我使用标准外观if-statement,true则返回我认为的样子:

def exist­s_else(bas­e, fallb­ack)
  unless base.­nil?
    base
  else
    fallb­ack
  end
end

a = true
exists_els­e( a, false­ )
# => true

如果我使用下面显示的内联实现,它会返回false.

def exist­s_else(base, fallback)
  base unles­s base.nil­? else fallback
end

a = true
exists_els­e( a, false­ )
# => false

为什么它false在内联实现中返回?

4

3 回答 3

6

你的断言

base unles­s base.nil­? else fallback

应该等价于长式unless陈述是不正确的;实际上,您不能else在后置条件中使用。Ruby 将代码解释为:

def exist­s_else(base, fallback)
  base unles­s base.nil­?
else fallback
end

如果你在 IRB 中输入这个(或没有换行符的版本,如你的问题),Ruby 会给出以下警告:

warning: else without rescue is useless

也就是说,Ruby 试图将 解释else为异常处理代码的一部分,如

def exists_else(base, fallback)
  base unless base.nil
rescue ArgumentError => e
  # code to handle ArgumentError here
else
  # code to handle other exceptions here
end
于 2013-09-09T05:03:27.910 回答
4

else当您尝试在一行中执行时,您不能使用语句。必要时else,您必须使用扩展版本。

Ruby 认为else在这种情况下与错误处理有关。你必须坚持你最初的unless-end方法。

于 2013-09-09T05:03:19.687 回答
1

我更喜欢这种语法来评估真/假检查:

condition(s) ? true_value : false_value

在您的情况下,它看起来像:

def exists_else(base, fallback)
  base.nil? ? fallback : base
end

a = true
puts exists_else(a, false)  # => true
于 2013-09-09T15:01:30.757 回答