混亂的情況下:如何使用ruby splat操作符?我們可以對它進行一些操作嗎?
arr = [:one, :two]
attr_accessor *arr + [:three]
在這種情況下,我們似乎做的圖示*arr
一個+
操作。但是,通常我們無法對splat執行任何操作。所以這讓我感到困惑。
我更喜歡這樣的另一種情況:
arr = [:one, :two]
attr_accessor *(arr << :three)
那麼,你怎麼看?
混亂的情況下:如何使用ruby splat操作符?我們可以對它進行一些操作嗎?
arr = [:one, :two]
attr_accessor *arr + [:three]
在這種情況下,我們似乎做的圖示*arr
一個+
操作。但是,通常我們無法對splat執行任何操作。所以這讓我感到困惑。
我更喜歡這樣的另一種情況:
arr = [:one, :two]
attr_accessor *(arr << :three)
那麼,你怎麼看?
不,你的優先順序錯了。 *arr + [:three]
是*(arr + [:three])
,所以它將三個參數潑到attr_accessor
上。 splat的結果不是Ruby值,因此無法對其執行任何操作。它不是運營商在同一意義上,+
是運營商。 +
是一種方法,*
的這種用法不是。
(這裏沒有意見,只對紅寶石是如何工作的事實。)
感謝您的回答。我想優先級應該是你說的。但是,我沒有找到紅寶石的理論基礎。因此,可以請提供一個鏈接或其他可以顯示優先級定義的內容。再次感謝。 – hiveer
正如我所說,它不是一個操作符,所以它不會得到傳統的「優先級」:它是Ruby語法的一部分。看看[這裏](http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/yacc.html),規則爲'WHEN_ARGS','MLHS','MRHS', 'CALL_ARGS','ARGLIST'(你的情況是'CALL_ARGS',作爲'attr_accessor'的參數)。規則說明星可以在參數之前,其中參數是任何類型的表達式(例如'arr + [:three]')。 – Amadan
注意,第二示例修改陣列'arr',而第一個沒有。 – Jon