2014-11-14 163 views
1

有人可以幫我理解下面的代碼嗎?有人可以解釋respond_to嗎? :每?

array = [1,2,3,4]; 
if array.respond_to? :each 
    puts "1234" 
else 
    puts "5678" 
end 

我可以理解的代碼的結果,但什麼是:each語法?

:each一個全局方法嗎?爲什麼我們可以這樣寫呢?或者我可以如何瞭解它?

回答

7

:each是一個Symbol,這有點像String,但更有限,更有效的比較平等。它是不是的一種方法;它確實是一種方法名稱

respond_to?是在Object上定義的方法,幾乎​​所有的Ruby對象都最終從中繼承。

當你說[1, 2, 3, 4].each時,它會發送信息:eachArray對象[1, 2, 3, 4]Array類對象知道它的實例知道在接收到這樣的消息時該怎麼做,因此Array.respond_to?(:each)返回true。基本上,如果array.respond_to?(:each)false,那麼array.each將引發錯誤。 [請注意,因爲p11y在評論中註釋,如果array確實是Array,那麼這將始終返回true。但程序員可以說謊,並且array不一定是Array;例如:array = "not an Array, fooled you!"]

[1, 2, 3, 4].respond_to? :each相當於[1, 2, 3, 4].respond_to?(:each)

在附註上,如果您想在一行中填充多個語句,那麼在Ruby中只需要分號。例如,與C不同的是,分號是語句終止符,在Ruby中它是語句分隔符。因此編寫array = [1, 2, 3, 4];是不好的風格。

+3

+1你解釋得好多了。注意:變量'array'實際上命名不好,因爲它也可能包含與Array不同的東西,因此檢查。 –

+0

謝謝,好點。 – Amadan

+0

謝謝你一噸!現在感覺好多了〜! :D也,我看到一些文檔說,如果我們定義一個字符串像: – wiwengweng