簡體   English   中英

Ruby 中的操作員優先級和評估順序:產量 vs <<(鏟操作員)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM