2010-10-18 33 views
0

示例阵列别名用于Ruby的数组或哈希元素

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 

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

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

UPDATE:问题已解决,建议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}] 

回答

4

你想要什么是不可能的。 Ruby中没有任何特性可以用来让你的例子像你想要的那样工作。

但是既然你说你只想使用它只读,没有必要这样做。你可以做x = myNestedStructure[foo][bar][baz]。当你这样做的时候不会涉及拷贝。赋值不会复制ruby中的赋值对象。

2

你将不得不创建一个方法,它是你的别名,它会更新数据。

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

然后调用它。

self.y="foo" 

编辑:更新了第二个代码片段。

+0

不,你不能。你可以用'self.y =“foo”'调用它,但不能用'y =“foo”'调用它。无论定义什么setter方法,'y =“foo”'将始终分配给局部变量'y'。 – sepp2k 2010-10-18 15:11:29

+0

第二个片段需要是'self.y = foo',否则即使方法y在范围内,也会分配局部变量y。 – 2010-10-18 15:11:42

+0

感谢您的修复。 – Jeremy 2010-10-18 15:13:14