获取实例名称

有没有办法在类方法中获取我们为特定类创建的实例的名称?

这就是我想要做的:

module MyObjectStore values = {} temp= {} define_method :add_check_attribute do |method,*args| if method.to_s =~ /=$/ temp[method[0..-2]] = args[0] else instance_variable_get("@#{method}") end end define_method :method_missing do |method,*args| add_check_attribute(method,*args) end define_method :save do temp.each {|key,value| instance_variable_set("@#{key}",value)} values[self] = temp end end class C include MyObjectStore end a = C.new a.id = 1 a.name = 'gaurav' a.save 

在模块的倒数第三行,我试图将对象的值存储到以实例名称为键的新哈希中。

有可能吗?

我现在正在使用self ,但它给出了整个对象,而不是实例名称。

Ruby对象除了内存地址外没有其他名称。 但是,每个对象都有一个始终唯一的object_id 。 使用ObjectSpace._id2ref ,实例和ID是可互换的。 这是一个例子:

 id="Hello, World".object_id => 82609910 ObjectSpace._id2ref(id) => "Hello, World" "Hello, Ruby".object_id => 82721540 

值得一提的是,对象id虽然对于一个对象在其生命周期内是常量,但在程序运行之间几乎不会保持不变,并且具有完全相同数据的不同对象将具有不同的ID:

 "Hi".object_id => 82719050 "Hi".object_id => 82715090 

对象ID也依赖于运行并依赖于操作系统等。永远不要将对象ID硬编码到源代码中,只使用通过object_id获得的ID。

实例名称应该是什么? 除非您在讨论特定属性(如name ),否则实例实际上没有名称。 它可以由具有名称的变量 引用 ,但两者是不同的。

所以:

  • 除了一些内存句柄或解释器使用的类似机制之外,对象没有“名称”。
  • 变量具有名称,但可以在程序执行期间引用不同的实例。
  • 不同的变量可以指同一个实例。

鉴于最后一点,实例应如何决定“名称”?

解决此问题的一种方法是使用内存地址或某种散列函数作为对象名称。 散列函数有点棘手,因为它会随着对象的变化而变化。

您还可以决定在所有实例上都有一个idname字段并使用它。 保持独特。 有乐趣保证。 发疯。 回来开明。 教我们。