我想知道为什么以及如何将方法的名称自动变成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 :(得分:2)
好问题。
你的观察是正确的。
方法名称在内部存储为符号。每个Ruby类都有一个内部哈希,它将符号映射到字节码的指令序列。虽然Javascript要么不区分字符串和符号,要么没有将这种区别暴露给程序员,后者更有可能。
符号是一种可以追溯到Smalltalk和Scheme等早期语言的概念。它们是字符串的内部表示形式,具有附加合同,所有具有相同名称的符号始终是相同的对象。这允许语言优化内部过程,如调用方法或查找类名。
有趣的是,Ruby符号在内部表示为带标记的整数,并且有一个内部表将这些幻数映射到标识符名称。
答案 1 :(得分:0)
方法名称不自动"成为什么。 methods
方法只返回已定义的方法,并将描述为符号,仅此而已。
如果您想专门研究某种方法,请执行以下操作:
aaron.method(:get_name)
# => #<Method: BankAccount#get_name>
请注意,这完全等同于:
aaron.method("get_name")
method
方法不关心你是否给它一个字符串或符号,它会根据需要进行转换。
然后你可以用以下内容来查询:
aaron.method(:get_name).source_location
Method
类支持的任何其他内容同样有效。