[英]Operator Precedence and Order of Evaluation in Ruby: yield vs << (shovel operator)
我正在閱讀這本書Well-Grounded Rubyist and its Control-Flow Techniques chapter on p.184 有一個簡單的例子,用迭代器實現 map:
class Array
def my_map
c=0
acc = []
until c == size
acc << yield self[c]
c += 1 end
acc
end
end
運行此代碼ruby MY_FILE.rb
時出現以下錯誤:
MY_FILE.rb:6: syntax error, unexpected `self', expecting `end'
acc << yield self[c]
解決這個問題的方法是在yield self[c]
周圍加上括號,所以整行看起來像這樣:
acc << (yield self[c])
然后,該例程適用於這一單行更改。 據我了解,問題出在運算符優先級或評估順序上。 我瀏覽了 web 很長一段時間,但無法查明為什么書中的代碼不起作用。
為什么本書的例子不起作用? acc << yield self[c]
中的運算符優先級或/和評估順序是什么?
通常,方法參數放在括號中:
x=foo(y)
a=bar(baz(z))
b=7+baz(w)
在某些情況下(即如果優先級不以其他方式綁定),您可以省略大括號。 所以,
x = foo y
有效,但是
a = bar baz z
被解釋為
a = (bar(baz))(z)
和
b = 7 + baz w
作為
b = (7+baz) w
如果對表達式的解釋產生有意義的結果,那么這是有風險的。 在這種情況下,您甚至不會收到錯誤消息,但程序只會以與您預期不同的方式運行。
通常,在調用方法時始終使用括號是個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.