有没有办法在类方法中获取我们为特定类创建的实例的名称?
这就是我想要做的:
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。
关于ruby - 获取实例名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8574060/