Ruby中数组或哈希元素的别名

时间:2010-10-18 14:45:06

标签: ruby alias variable-alias

数组

的示例
arr = ["a", "b", "c"]
# TODO create an alias for arr[1] as x
x = "X"
# arr should  be ["a", "X", "c"] here

哈希

的示例
hash = { :a => "aaa", :b => "bbb" , :c => "ccc" }
# TODO create an alias for hash[:b] as y
y = "YYY"
# hash should be { :a => "aaa", :b => "YYY" , :c => "ccc" } here

还有变量的别名吗?

var = 5
# TODO create an alias for var as z
z = 7
# var should be 7 here

动机:我有一个很大的深层数据构建,你可以想象其余的。我想以只读方式使用它,但由于性能原因,不允许复制。

隐喻:我想从更大的数据结构中选择上下文,我想用一个简短的名称来访问它。

更新:问题已解决,因为sepp2k建议。我只是想在这里总结一下有关解决方案的图片。

irb(main):001:0> arr = [ { "a" => 1, "b" => 2}, { "x" => 7, "y" => 8 } ]
=> [{"a"=>1, "b"=>2}, {"x"=>7, "y"=>8}]
irb(main):002:0> i = arr[0]
=> {"a"=>1, "b"=>2}
irb(main):004:0> j = arr[1]
=> {"x"=>7, "y"=>8}
irb(main):007:0> j["z"] = 9
=> 9
irb(main):008:0> j
=> {"x"=>7, "y"=>8, "z"=>9}
irb(main):009:0> arr
=> [{"a"=>1, "b"=>2}, {"x"=>7, "y"=>8, "z"=>9}]

2 个答案:

答案 0 :(得分:4)

你想要的是不可能的。 ruby中没有可用于使您的示例按您所希望的方式工作的功能。

然而,既然你说你只想以只读方式使用它,那就没有必要了。你可以x = myNestedStructure[foo][bar][baz]。当你这样做时,不会涉及复制。赋值不会复制ruby中的已分配对象。

答案 1 :(得分:2)

您必须创建一个作为别名的方法,这将更新数据。

def y=(value)
  arr[:b]=value
end

然后打电话。

self.y="foo"

修改:更新了第二个代码段。