我不小心发现了Ruby的习语||=(),如:
def app_logger
@app_logger ||= (
logfile = File.open(::Rails.root.join(LOG_FILE), 'a')
logfile.sync = true
AppLogger.new(logfile)
)
end
Run Code Online (Sandbox Code Playgroud)
我尝试使用{}而不是(),但它没有用.我以为{}是要封闭一个块.
这是一个已知的成语吗?这是一种好风格吗?
我没有找到关于这种括号使用的文档.任何指针都会有所帮助.
请注意这篇文章是关于使用()这种方式,而不是使用||=.关于后一种习语已经有很多帖子了.
就像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
Run Code Online (Sandbox Code Playgroud)
Ruby中的很多东西都评估为单个值,而内容(...)显然是其中之一.
你另一个foo ||= (a=10; a+10)"更好"的例子也颇具争议.这会进行两次分配和添加,但只是有条件的.这个几乎总是更好地用长形式写成begin/ end以明确a+10结果.
从风格的角度来看,隐藏其中的"重要"部分a+10,在一条线的末尾是坏的,它可以被忽视.将它作为最后一行使其非常清楚.这也是为什么if在长行末尾添加语句也很糟糕的原因,它隐藏了该行只是有条件执行的原因.
对于简洁性的关注总是被可读性的担忧所压倒.在磁盘上保存几个字节不会对你有所帮助,因为有人误读了你的代码,他们引入了一个严重的错误.
这人可能是你在未来,当你埋头于自己的聪明赶上了.在某些时候发生在我们所有人身上.
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |