2015-05-13 70 views
0

混亂的情況下:如何使用ruby splat操作符?我們可以對它進行一些操作嗎?

arr = [:one, :two] 
attr_accessor *arr + [:three] 

在這種情況下,我們似乎做的圖示*arr一個+操作。但是,通常我們無法對splat執行任何操作。所以這讓我感到困惑。

我更喜歡這樣的另一種情況:

arr = [:one, :two] 
attr_accessor *(arr << :three) 

那麼,你怎麼看?

+1

注意,第二示例修改陣列'arr',而第一個沒有。 – Jon

回答

2

不,你的優先順序錯了。 *arr + [:three]*(arr + [:three]),所以它將三個參數潑到attr_accessor上。 splat的結果不是Ruby值,因此無法對其執行任何操作。它不是運營商在同一意義上,+是運營商。 +是一種方法,*的這種用法不是。

(這裏沒有意見,只對紅寶石是如何工作的事實。)

+0

感謝您的回答。我想優先級應該是你說的。但是,我沒有找到紅寶石的理論基礎。因此,可以請提供一個鏈接或其他可以顯示優先級定義的內容。再次感謝。 – hiveer

+1

正如我所說,它不是一個操作符,所以它不會得到傳統的「優先級」:它是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

相關問題