2017-02-17 42 views
0

我想知道爲什麼和如何方法的名稱自動成爲Ruby中的符號。當我運行下面的代碼:如何以及爲什麼方法的名稱在Ruby中成爲符號?

# create a BankAccount class 
class BankAccount 
    def initialize(name) 
    @name = name 
    @transactions = [] 
    end 

    def get_name 
    @name 
    end 
end 

aaron = BankAccount.new("Aaron") 
aaron.methods 

它會自動創建一個「:get_name」符號,這是指什麼?這是怎麼發生的?


我的意思是,在JavaScript中,我可以通過定義方法的名稱:

let fn = function(){ 
    return "This is a function" 
} 

console.log(fn) 

通過的console.log(FN),我可以得到的 「Fn」。 但在Ruby中,如果該fn將變爲:fn?或者「fn」和「:fn」的區別是什麼?

對不清楚的描述?


我檢查文檔。

函數的名稱是否成爲符號,同時由Method#name定義方法?

+0

用什麼方式代表方法名稱?字符串? – sawa

+0

對不起,當我粘貼我的代碼時發生錯字 – PJCHENder

回答

0

方法名稱不會「自動」變成任何東西。 methods方法只是返回已定義的方法,並將它們描述爲符號,僅此而已。

如果你想要做一些研究方法而言,做到這一點:

aaron.method(:get_name) 
# => #<Method: BankAccount#get_name> 

注意,這是完全等價的:

aaron.method("get_name") 

如果你給它的method方法不關心一個字符串或符號,它根據需要進行轉換。

然後你就可以查詢與喜歡的東西:

aaron.method(:get_name).source_location 

別的了Method類支持同樣是有效的。

2

偉大的問題。

你的觀察是正確的。

方法名稱在內部存儲爲符號。每個Ruby類都有一個內部散列,它將符號映射到字節碼的指令序列。 Javascript不區分字符串和符號,或者不將這個區別暴露給程序員,後者更可能。

符號是一個可以追溯到早期語言如Smalltalk和Scheme的概念。它們是字符串的內部表示,附加契約是所有具有相同名稱的符號始終是同一個對象。這允許語言優化內部過程,如調用方法或查找類名。

有趣的是,Ruby符號在內部表示爲帶標記的整數,並且有一個內部表將這些幻數映射到標識符名稱。

+0

通過Method#名稱內部存儲爲符號的方法名稱? – PJCHENder

+0

每個對象都會散列一個內部散列,將符號映射到字節碼的指令序列。您可以訪問的「方法」對象是該對象的外部表示,即所謂的「反射」,就像您通過鏡子查看它一樣。 – akuhn

相關問題