为什么这两种方法看起来相同?

Pau*_*ler 2 ruby syntax

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

如果我使用标准的look- ifstatement,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
Run Code Online (Sandbox Code Playgroud)

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

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

a = true
exists_els­e( a, false­ )
# => false
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ley 6

你的断言

base unles­s base.nil­? else fallback
Run Code Online (Sandbox Code Playgroud)

应该等同于长形式的unless陈述是不正确的; 事实上,你不能else在帖子条件内使用.Ruby将代码解释为:

def exist­s_else(base, fallback)
  base unles­s base.nil­?
else fallback
end
Run Code Online (Sandbox Code Playgroud)

如果您在IRB中键入此(或没有换行符的版本,如您的问题),Ruby会发出以下警告:

warning: else without rescue is useless
Run Code Online (Sandbox Code Playgroud)

也就是说,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
Run Code Online (Sandbox Code Playgroud)

  • 这就是你应该阅读警告的原因. (3认同)