获取实例名称

时间:2011-12-20 10:31:38

标签: ruby

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

这就是我想要做的事情:

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,但它会提供整个对象,而不是实例名称。

2 个答案:

答案 0 :(得分:6)

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。

答案 1 :(得分:2)

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

所以:

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

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

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

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