Псевдоним для массива или хеш-элемента в Ruby - PullRequest
0 голосов
/ 18 октября 2010

Пример для массива

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 ]

4 голосов
/ 18 октября 2010

То, что вы хотите, не возможно.В ruby ​​нет функции, которую вы могли бы использовать, чтобы ваши примеры работали так, как вы хотите.

Однако, поскольку вы говорите, что хотите использовать его только для чтения, в этом нет необходимости.Вы можете просто сделать x = myNestedStructure[foo][bar][baz].Там не будет никакого копирования, когда вы это сделаете.Назначение не копирует назначенный объект в ruby.

2 голосов
/ 18 октября 2010

Вам необходимо создать метод, который будет вашим псевдонимом, который будет обновлять данные.

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

Тогда позвони.

self.y="foo"

Редактировать: обновлен второй фрагмент кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...