首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算实例变量的映射

计算实例变量的映射
EN

Stack Overflow用户
提问于 2019-12-03 07:11:54
回答 1查看 176关注 0票数 0

我的模块方法应该返回一个Hash,其中键是表示self实例变量的符号,Hash值是它们各自的值。我想出了以下解决方案:

代码语言:javascript
运行
复制
module M

  def self.set
      @foo = 5
  end

  def self.ivar_map
    Hash[instance_variables.map{|iv| [iv, instance_variable_get(iv)]}]
  end

end

M.set
M.ivar_map # => {:@foo=>5}

当然,这是可行的,但我想知道是否没有更简单的方法来实现同样的结果。毕竟,Ruby必须以某种方式维护这样一个符号表,将变量映射到它们的内容中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-03 08:43:09

当然,

这样做是可行的,但我想知道是否没有更简单的方法来实现同样的结果。

您可以做一些轻微的简化:

如果将Hash::[].

  • Use .

添加到Ruby.中,则

代码语言:javascript
运行
复制
module M
  def self.ivar_map
    instance_variables.zip(instance_variables.map(&method(:instance_variable_get))).to_h
  end
end

或者使用试验性方法(并在2.7.0-Preview3中再次删除)方法引用操作符:

代码语言:javascript
运行
复制
module M
  def self.ivar_map
    instance_variables.zip(instance_variables.map(&self.:instance_variable_get)).to_h
  end
end

毕竟,

必须以某种方式维护这样一个符号表,将变量映射到它们的内容中。

事实上,这不是真的。几个Ruby实现(包括YARV,使用最广泛的一个)在一定程度上优化了实例变量。例如,我相信YARV直接在对象头中存储多达三个实例变量,而不使用实例变量表。

而YARV在优化方面则更简单。其他实现,如Rubinius、JRuby、TruffleRuby和RubyOMR执行的优化要复杂得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59151851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档