2013-08-31 35 views
0

例如,Array類有一個名爲「的.sort」你用下面的語法定義的數組上調用方法:紅寶石 - 編寫方法沒有「參數」

[2, 3, 4, 1].sort 

從我有限的知識,我只知道如何編寫採取實際參數的方法:

def sort(array) 
    ... 
end 

和被稱爲例如:

sort([2, 3, 4, 1]) 

你會如何去大約爲S設置一個可以用點符號調用的方法(請糾正我,如果我錯了)語法? *要澄清,我想添加一個方法到現有的類數組,可以刪除重複的對象。我知道「.uniq」方法已經這樣做了,但我正在重新編寫它,以便學習如何完成它。我只知道如何編寫該方法:

def my_uniq(array) 
    ... 
end 

其中數組是我可以在我的方法中使用的參數。

回答

2

你應該開始將消息發送到對象的角度來思考。即不要將它們視爲調用方法,請將它們視爲sending message to object(s)。當你發送消息的時候,對象會檢查它是否可以完成請求(即檢查這個名字中是否存在一個方法,如果存在的話)。所以本質上,sort是一個消息(方法)到array對象。

class Array 
    def sort 
    # do sorting 
    end 

    # example taken from @codycaughlan 
    # allows you to send message `hi` to your array object 
    def hi 
    "Hi, #{length}" 
    end 
end 

# so instead of calling method hi([2,9,0]) 
# send hi message to an array object 

[2,9,0].hi 

# instead of calling method sort([2,9,0]) 
# send sort message to an array object 

[2,9,0].sort 

更新

讓我們說你要編寫一個打印*乘以你通過數陣列上奏效的方法。

class Array 
    def print_stars 
    self.each { |i| puts "*" * i} 
    end 
end 

# now let us send a message/call 
[1,2,3].print_stars #=> this should produce 

* 
** 
*** 

正如你可能已經知道的那樣,這些消息可以被鏈接。對於例如

[1,2,3].reverse.print_stars #=> produces 

*** 
** 
* 
+0

我會如何去與我發送消息的數組對象「玩」。例如,使用這種方法,我對類Array進行「猴子補丁」,我通常會使用參數數組,使用.each遍歷數組,如果元素已經存在,刪除等等。我將如何寫我想要訪問這個數組是我想說的。 – jchi2241

+0

@ user2684075在一個方法中,你使用關鍵字'self'引用接收者。 – toro2k

+0

或者我應該說,有一個與參數相關的變量。在創建與接收器一起工作的方法或我發送消息的對象時,將輸入什麼「變量」? – jchi2241

0

這取決於「參數」是什麼。在您的例子:

[2, 3, 4, 1].sort

的說法是Array一個實例。你可以猴子補丁Array添加你所選擇的方法:

class Array 
    def hi 
    "Hi, #{length}" 
    end 
end 

puts [1,2,3].hi 

=> Hi, 3 
+4

接收者通常不被稱爲參數。 – sawa