【发布时间】:2010-10-11 11:15:31
【问题描述】:
我喜欢 ruby 的一点是,它主要是一种可读性很强的语言(非常适合自记录代码)
但是,受这个问题的启发:Ruby Code explained
以及||= 如何在 ruby 中工作的描述,我在考虑我不使用的 ruby 习语,坦率地说,我并没有完全理解它们。
所以我的问题是,类似于引用问题中的示例,我需要了解哪些常见但不明显的 ruby 习语才能成为真正精通 ruby 的程序员?
顺便说一下,从引用的问题
a ||= b
等价于
if a == nil || a == false
a = b
end
(感谢 Ian Terrell 的更正)
编辑:事实证明,这一点并非完全没有争议。正确的展开其实是
(a || (a = (b)))
查看这些链接了解原因:
- http://DABlog.RubyPAL.Com/2008/3/25/a-short-circuit-edge-case/
- http://DABlog.RubyPAL.Com/2008/3/26/short-circuit-post-correction/
- http://ProcNew.Com/ruby-short-circuit-edge-case-response.html
感谢 Jörg W Mittag 指出这一点。
【问题讨论】:
-
通常更简洁地表述为:
foo ||= bar等价于foo || foo = bar -
我认为说它相当于 foo = foo || 更清楚。 bar,就像 foo *= bar 等价于 foo = foo * bar。
-
Chuck - 但事实并非如此。区别在于
obj.foo ||= bar这样的情况,如果是obj.foo = obj.foo || bar,那么即使 obj.foo 是错误的(并且 obj.foo= 可能有副作用),也会调用 obj.foo=。但这不是它的工作原理 -
可读性强?相比什么?我发现 Ruby 非常适合愚蠢的代码技巧(编写循环的 35 种方法!块和 lambdas 和其他东西),但是成语使它变得非常不可读。但是,既然做事的方法有很多,总要找到一种(或几种)方法来做某事……
-
"grok" 也是 Python Web 框架的名称。为了消除混淆,我从您的问题中删除了标签