我的方法exists_else有两个参数:base和fallback.如果base是nil,则返回fallback.如果不是nil,则返回base.一个exists_else(true, false)应该回来的电话true.
如果我使用标准的look- ifstatement,true就像我认为的那样返回:
def exists_else(base, fallback)
unless base.nil?
base
else
fallback
end
end
a = true
exists_else( a, false )
# => true
Run Code Online (Sandbox Code Playgroud)
如果我使用下面显示的内联实现,它将返回false.
def exists_else(base, fallback)
base unless base.nil? else fallback
end
a = true
exists_else( a, false )
# => false
Run Code Online (Sandbox Code Playgroud)
为什么它会false在内联实现中返回?
你的断言
base unless base.nil? else fallback
Run Code Online (Sandbox Code Playgroud)
应该等同于长形式的unless陈述是不正确的; 事实上,你不能else在帖子条件内使用.Ruby将代码解释为:
def exists_else(base, fallback)
base unless 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)