我的方法exists_else
有两个参数:base
和fallback
。如果base
为nil
,则返回fallback
。如果不是nil
,则返回base
。致exists_else(true, false)
的电话应该返回true
。
如果我使用标准的if
语句,true
会像我认为的那样返回:
def exists_else(base, fallback)
unless base.nil?
base
else
fallback
end
end
a = true
exists_else( a, false )
# => true
如果我使用下面显示的内联实现,则返回false
。
def exists_else(base, fallback)
base unless base.nil? else fallback
end
a = true
exists_else( a, false )
# => false
为什么它会在内联实现中返回false
?
答案 0 :(得分:6)
你的断言
base unless base.nil? else fallback
应该等同于长格式unless
语句不正确;事实上,你不能在帖子条件中使用else
。 Ruby将代码解释为:
def exists_else(base, fallback)
base unless 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
答案 1 :(得分:4)
如果您尝试在一行中执行此操作,则无法使用else
语句。当需要else
时,您必须使用扩展版本。
Ruby认为在这种情况下else
与错误处理有关。您必须坚持使用最初的unless-end
方法。
答案 2 :(得分: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