使用括号在Ruby中包含一个块?

Zac*_* Xu 4 ruby

我不小心发现了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)

我尝试使用{}而不是(),但它没有用.我以为{}是要封闭一个块.

这是一个已知的成语吗?这是一种好风格吗?

我没有找到关于这种括号使用的文档.任何指针都会有所帮助.

请注意这篇文章是关于使用()这种方式,而不是使用||=.关于后一种习语已经有很多帖子了.

tad*_*man 6

就像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在长行末尾添加语句也很糟糕的原因,它隐藏了该行只是有条件执行的原因.

对于简洁性的关注总是被可读性的担忧所压倒.在磁盘上保存几个字节不会对你有所帮助,因为有人误读了你的代码,他们引入了一个严重的错误.

可能是你在未来,当你埋头于自己的聪明赶上了.在某些时候发生在我们所有人身上.