我无意中发现了 ||=()
的 Ruby 习语,
如:
def app_logger
@app_logger ||= (
logfile = File.open(::Rails.root.join(LOG_FILE), 'a')
logfile.sync = true
AppLogger.new(logfile)
)
end
我尝试使用 {}
而不是 ()
,但没有成功。我认为 {}
是为了包含一个 block 。
这是一个众所周知的成语吗?风格不错吗?
我还没有找到很多关于这种括号用法的文档。任何指示都会有所帮助。
请注意这篇文章是关于以这种方式使用 ()
的,而不是 ||=
的使用。已经有很多关于后一种成语的帖子。
最佳答案
就像 Ruby 中的许多可以完成的事情一样,其中许多不应该完成,这就是其中之一。
在已经有其他工具的情况下使用括号对代码进行分组可能会造成混淆,而且几乎肯定与许多编码风格指南背道而驰。如果我在我管理的代码中看到这个,我会立即修复它。
最好使用 begin
/end
标记来完全清楚发生了什么:
def app_logger
@app_logger ||= begin
logfile = File.open(::Rails.root.join(LOG_FILE), 'a')
logfile.sync = true
AppLogger.new(logfile)
end
end
Ruby 中的很多东西都评估为单个值,(...)
的内容显然就是其中之一。
你的另一个例子 foo ||= (a=10; a+10)
是“更好的”也很有争议。这会进行两次赋值和加法,但只是有条件的。这个几乎总是最好写成带有 begin
/end
的长格式,以明确 a+10
是结果。
从样式的角度来看,将其中的“重要”部分(a+10
)隐藏在一行的末尾是不好的,它可以被忽略。将它作为最后一行使其非常清楚。这也是为什么在长行的末尾添加 if
语句也是不好的,它隐藏了该行只是有条件地执行。
对简洁性的关注总是被对可读性的关注压倒。在磁盘上保存几个字节对您一点帮助都没有,因为有人误读了您的代码,他们引入了一个严重的错误。
当你陷入自己的聪明才智中时,那个某人可能就是你。我们所有人都曾在某个时候发生过。
关于ruby - 在 Ruby 中使用括号括起一个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320144/