我的模块方法应该返回一个Hash,其中键是表示self实例变量的符号,Hash值是它们各自的值。我想出了以下解决方案:
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必须以某种方式维护这样一个符号表,将变量映射到它们的内容中。
发布于 2019-12-03 08:43:09
当然,
这样做是可行的,但我想知道是否没有更简单的方法来实现同样的结果。
您可以做一些轻微的简化:
如果将Hash::[].
Array#zip.
添加到Ruby.中,则
Array#to_h而不是使用Object#method或类似the 之类的无点样式。module M
def self.ivar_map
instance_variables.zip(instance_variables.map(&method(:instance_variable_get))).to_h
end
end或者使用试验性方法(并在2.7.0-Preview3中再次删除)方法引用操作符:
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执行的优化要复杂得多。
https://stackoverflow.com/questions/59151851
复制相似问题