对象方法中符号的唯一性

Uniqueness of symbols in object methods

鉴于符号是唯一的,下面: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

如何让两个具有相同 name/object ID 的符号指向不同的方法?

您的两种 test 方法 return nil。所以得到的object id就是nil:

的object id
nil.object_id
# => 8

符号的存储方式不同于字符串。 :test 的任何存在总是等于 :test 因为符号是不可变的,不像字符串。那里有更多描述 here or here

用于确定该方法存在的 :test 将与您存储在不同 class 中的相同符号 :test 用于 params[:test] = "something

另一件需要注意的事情是,当您在 ruby 对象上调用方法时,从技术上讲,您是在向 class 发送消息。所以你的例子表明他们都回复了消息 :test。这将调用 class 上的方法。这是准确的。