对象方法中符号的唯一性
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 上的方法。这是准确的。
鉴于符号是唯一的,下面: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
:
nil.object_id
# => 8
符号的存储方式不同于字符串。 :test
的任何存在总是等于 :test
因为符号是不可变的,不像字符串。那里有更多描述 here or here。
用于确定该方法存在的 :test
将与您存储在不同 class 中的相同符号 :test
用于 params[:test] = "something
。
另一件需要注意的事情是,当您在 ruby 对象上调用方法时,从技术上讲,您是在向 class 发送消息。所以你的例子表明他们都回复了消息 :test
。这将调用 class 上的方法。这是准确的。