问题:
Ruby 安全导航运算符 ( &.
) 是否在其接收器为 时评估其参数nil
?
例如:
logger&.log("Something important happened...")
"Something important happened..."
字符串是否在这里评估?- 您能否提供一个权威来源,证明或否认这一事实?
- 或者建议一种如何检查它的方法?
提前致谢。
为什么我要寻找这个问题的答案?
我在整个代码库中都有如下代码:
logger.log("Something important happened. (#{Time.current})") if verbose
if verbose
我的主要目标是在我调用该方法时删除重复检查,log
因为它很容易忘记它,并且您根本不会收到有关误用的通知。
受Tell启发,不问原则,
我已经在方法实现中移动了if verbose
检查。log
class Logger
# ...
def log(message)
return unless verbose
# ...
end
end
def logger
@logger ||= Logger.new
end
logger.log("Something important happened. (#{Time.current})")
if verbose
这种方法简化了我的代码,因为我已经解决了我的主要问题 -每当我调用该log
方法时,我都不需要记住放置,
但我收到了另一个问题。
"Something important..."
string 总是被评估,无论verbose
是true
还是false
。
因此,我完全改变了解决方案:
logger
nil
何时返回。verbose
_false
- Ruby 安全导航运算符应在
log
调用前使用。
def logger
@logger ||= Logger.new if verbose
end
logger&.log("Something important happened. (#{Time.current})")
结果,我将最初记住if verbose
检查的问题替换为记住&.
调用。
但是,无论如何,我认为这是一种改进,因为忘记使用安全导航操作符会引发NoMethodError
,换句话说,通知log
方法误用。
所以现在,为了确保“安全导航操作员方法”实际上是解决我的问题的“更好”选择,
我需要确切知道 Ruby 中的安全导航运算符是否在其接收器为nil
.