方法的名称如何以及为何成为Ruby中的符号?

时间:2017-02-17 02:42:27

标签: 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 ??

定义方法时,函数的名称是否成为符号

2 个答案:

答案 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类支持的任何其他内容同样有效。