ruby - 获取实例名称

标签 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,但它给出了整个对象,而不是实例名称。

最佳答案

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/

相关文章:

ruby - 如何在一种方法中产生 2 个 block

ruby-on-rails - 升级ruby和rails版本后has_many关系隐式转换错误

ruby - 如何使用 rvm 和 ree 更新 ruby​​gems?

ruby - 为什么 `Object.include` 和 `Fixnum.prepend` 的顺序很重要?

ruby-on-rails - 使用 namespace 在 Ruby on Rails 3 中构建 ActiveModel 时遇到问题

ruby - 注入(inject)方法如何工作?

ruby-on-rails - Ruby on Rails : Sending large pictures using send_data/send_file results in errors

ruby-on-rails - Ruby 渲染特定变量

ruby - 如何删除所有空格?

ruby - 无法使用 rbenv 安装 Ruby 2.5.1,出现 C 编译器错误