对象方法中符号的唯一性

时间:2015-11-16 05:26:50

标签: ruby unique symbols

鉴于符号是唯一的,下面的:test的两个实例(引用不同的方法(在不同的类中))具有相同的对象ID怎么可能?

class Dope
  def test 
  end
end

class Green
  def test
  end
end 

green = Green.new
dope = Dope.new 

green.methods.include?(:test) # => true 
dope.methods.include?(:test) # => true 

green.test.object_id # => 8
dope.test.object_id  # => 8

如何使用两个具有相同名称/对象ID的符号来引用不同的方法?

2 个答案:

答案 0 :(得分:2)

您的test个方法都返回nil。因此,您获得的对象ID是nil的对象ID:

nil.object_id
# => 8

答案 1 :(得分:1)

符号的存储方式与字符串不同。任何:test的存在总是等于:test,因为符号是不可变的,与字符串不同。有更多说明herehere

用于确定该方法是否存在的:test将与您存储在:test的其他类中的符号params[:test] = "something相同。

另外需要注意的是,当您在ruby对象上调用方法时,您在技术上会向该类发送消息。因此,您的示例显示它们都响应消息:test。哪个会调用该类的方法。这很准确。