2012-12-10 41 views
0

嗨我目前正在尋找一個紅寶石測驗解決方案(http://rubyquiz.com/quiz76.html),它對我來說很有意義,但我無法理解爲什麼沒有self或任何類型的接收器的方法shift, pop, scramblemunge_word爲什麼沒有這種方法的接收器?

class Array 
    def munge_each 
    map { |word| word.split(//).munge_word } 
    end 

    def munge_word 
    first, last, middle = shift, pop, scramble 
    "#{first}#{middle}#{last}" 
    end 

    def scramble 
    sort_by{rand} 
    end 
end 

是因爲它開闢了Array類和新增的功能呢?那些方法是類方法嗎?我認爲var1, var2 = var3, var4的語法只是簡單的多變量賦值。我從來沒有見過這種方法的一面。有人可以解釋嗎?

回答

4
first, last, middle = shift, pop, scramble 

這基本上等同於

first = shift 
last = pop 
middle = scramble 

的接收器(用於shiftpopscramble方法)是隱含的,它是self。這是Array的一個實例,因爲munge_word是一個實例方法。

我從來沒有在一面看過它的方法。

變量,方法 - 沒關係。右手值只需要是表達式的列表(或數組)。任何表達式。看看:

x = 1 

a, b = (x * 2), (x/0 rescue 5) 

a # => 2 
b # => 5 
+2

重要的是要注意,在像first = shift這樣的賦值中,只有等號的右邊將被解釋爲自我的消息。沒有接收器的作業總是簡單的變量賦值,所以這不會調用你的類可能碰巧的任何'first ='方法。 – Chuck

+0

@Chuck:是的,這很重要,謝謝。在初期被它咬了幾次:) –

2

自始終是可選的作爲實例方法的接收方。換句話說,一個簡單的實例方法調用總是被視爲指向自己。

因此,由於括號也是可選的,所以shift是一個方法調用,意思是self.shift。由於self是一個數組(因爲這些是在Array類已被打開的情況下定義的實例方法),所以我們告訴某些數組需要移位。等等。