"Chris Nolan", "producer"=>"Sum Duk", "writer"=>"Saad Bakk"} 我想将每个键和相-6ren">
gpt4 book ai didi

Ruby 将散列中的值转换为局部变量

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:45 25 4
gpt4 key购买 nike

假设我有这个哈希:

entry = {"director"=>"Chris Nolan", "producer"=>"Sum Duk", "writer"=>"Saad Bakk"}

我想将每个键和相关值提取到它自己的局部变量中:

director = "Chris Nolan"
producer = "Sum Duk"
...

通过使用循环而不是:

director = entry["director"]

因为有很多值,我不想单独做。

我发现它几乎完美地工作,除了它创建了一个实例变量,我想要一个局部变量,但是 local_variable_set 由于某种原因不存在。

entry.each_pair { |k, v| instance_variable_set("@#{k}", v) }

有解决办法吗?还是失败了,有一种方法可以将实例变量转换为本地变量并删除一个实例而不一个一个地执行?

最佳答案

选项 1

除了好玩我不能推荐这个,但它主要有你想要的效果:

entry.each |k, v|
singleton_class.send(:attr_accessor, k)
send("#{k}=", v)
end

director # => "Chris Nolan"
self.director = "Wes Anderson" # Unfortunately, must use self for assignment
director # => "Wes Anderson"

它不是创建局部变量,而是在当前对象的单例类上定义访问器方法,您可以像调用局部变量一样调用它们。

为了使它们更“本地化”,您可以使用 singleton_class.remove_method 在完成这些方法后删除它们。您甚至可以尝试使用相同的名称为任何现有的单例类方法添加别名,然后再恢复它们。

选项 2

这是我在实际代码中使用的东西。它需要 Ruby On Rails 附带的 ActiveSupport gem,但也可以单独使用。

director, producer, writer = entry.values_at('director', 'producer', 'writer')

不幸的是,它需要输入每个变量名称两次,而不是您要求的零次。如果您确定散列中值的顺序,您可以这样写:

director, producer, writer = entry.values  # Not so good, IMO.

我对这个版本感到不安,因为现在创建哈希的代码有一个不明显的责任来确保哈希按特定顺序排列。

注意

如果您的目标只是减少输入,这里有一种方法,每个变量访问只需要比真正的局部变量多两个字符:

e = OpenStruct.new(entry)
e.director # => "Chris Nolan"

关于Ruby 将散列中的值转换为局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13382224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com