在Ruby中,我怎样才能用散列而不是数组来获取示例变量呢?

7ivaypg9  于 2022-12-22  发布在  Ruby
关注(0)|答案(5)|浏览(118)

我有一个Ruby类,我想从类中的一个方法的参数中获取一个示例变量,我可以把所有的示例变量作为一个数组来获取:

self.instance_variables

但是,我想获得名为arg的示例变量,具体来说:

class MyClass
  def get_instance_variable(arg)
    hash_of_instance_variables[arg]
  end
end

object.get_instance_variable('my_instance_var')

如何计算hash_of_instance_variables

nnsrf1az

nnsrf1az1#

要创建所有示例变量的散列,可以使用以下代码:

class Object
  def instance_variables_hash
    Hash[instance_variables.map { |name| [name, instance_variable_get(name)] } ]
  end
end

但是正如 cam 在他的评论中提到的,你应该使用instance_variable_get方法来代替:

object.instance_variable_get :@my_instance_var
wtzytmuj

wtzytmuj2#

问题是相当老的,但找到了rails解决方案:instance_values
这是谷歌的第一个答案,所以也许它会帮助一些人。

zu0ti5jz

zu0ti5jz3#

class MyClass    
def variables_to_hash
      h = {}
      instance_variables.each{|a|
        s = a.to_s
        n = s[1..s.size]
        v = instance_variable_get a
        h[n] = v
      }
      h
    end
end
xjreopfe

xjreopfe4#

对于Ruby 2.6+,您可以将一个块传递给to_h方法,从而导致非常DRY的语法:

# Some instance variables
instance_variable_set(:@a, 'dog')
#=> "dog"
instance_variable_set(:@b, 'cat')
#=> "cat"

# Array of instance variable names
instance_variables
#=> [:@a, :@b]

# Hash of instance variable names and values, including leading @
instance_variables.to_h { |k| [k, instance_variable_get(k)] }
#=> { :@a => "dog", :@b => "cat" }

# Hash of instance variable names and values, excluding leading @
instance_variables.to_h { |k| [k[1..-1].to_sym, instance_variable_get(k)] }
#=> { :a => "dog", :b => "cat" }
yvfmudvl

yvfmudvl5#

RubyonRails有几种内置的方法来实现这一点,您可能会发现它们可以满足您的需要。
用户= User.new(名字:“布莱恩”,姓氏:“案件”)

*属性Rails API: ActiveModel::AttributeMethods

user.attributes
{“第一个”=〉“布莱恩”,“最后一个”=〉“案例”}

*可序列化散列(Rails API:活动模型序列化)

用户.可序列化散列
{“第一个”=〉“布莱恩”,“最后一个”=〉“案例”}

相关问题