有没有办法在类方法中获取我们为特定类创建的实例的名称?
这就是我想要做的事情:
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
,但它会提供整个对象,而不是实例名称。
答案 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
),否则实例实际上没有名称。它可以由带有名称的变量 引用,但两者是不同的。
所以:
鉴于最后一点,实例应如何决定“名称”?
解决此问题的一种方法是使用内存地址或某种散列函数作为对象名称。散列函数有点棘手,因为它会随着对象的变化而变化。
您还可以决定在所有实例上都使用id
或name
字段并使用该字段。保持独特。有乐趣保证。发疯。回来开明。教我们。