Как я могу это сделать в Ruby?
Например, в Ruby:
a = [1,2,3]
h= {vara: a}
p h[:vara] # [1,2,3]
a = [42,43,44]
p h[:vara] # [1,2,3] - still the same
Хэш показывает те же результаты (массив [1,2,3]
), хотя я изменил a
.
Что касается этого примера, я хочу хэш показывает разные результаты, когда a
изменения:
a = [1,2,3]
h= {vara: a}
p h[:vara] # [1,2,3]
a = [42,43,44]
p h[:vara] # [42,43,44] - changed!
Как это сделать в общем случае - переменная или контейнер (хэш в приведенном выше примере) не указывается?
Например, в C++ вы можете использовать ссылку:
#include <iostream>
#include <stdlib>
int main(void)
{
int a = 10;
int &var = a;
std::cout<< "\na = "<< a <<"\n";
a = 42;
std::cout<< "\nnew var = " << var << "\n"; //
std::cout<< "\nnew a = " << a << "\n";
system("pause");
return 0;
}
будет производить:
a = 10
new var = 42
new a = 42
В Ruby есть что-то подобное?
Вы просто заменить сдерживание экземпляра Array
с #replace
методом, так как =
оператор присваивания только Ассингом к имени переменного Иным например:
a = [1,2,3]
h = {vara: a}
h[:vara]
# => [1,2,3]
a.replace [42,43,44]
h[:vara]
# => [42, 43, 44]
Array#replace
, а не Hash#replace
.
У Ruby есть ссылки, но они больше похожи на C++ указатели (с прозрачным разыменованием).
Там нет эквивалента ссылок C/C++. Однако вы всегда можете написать расширение C.
Вместо того, чтобы полностью заменить ссылку "a", вы можете заменить содержание того, на что она указывает.
a = [1,2,3]
h= {vara: a}
p h[:vara]
a.replace([40, 41, 42]) # <== note here
p h[:vara]
# >> [1, 2, 3]
# >> [40, 41, 42]
В этом случае оба h[:para]
и a
все еще указывают на один и тот же массив. Но когда вы назначаете a
, ссылка ломается.
replace
состоит в том, что это не в каждом классе. Поскольку я проверил только String
, Array
, Hash
содержат этот метод. +1, потому что это работает для некоторой части классов ruby. пс. ТАК говорит, что вы были быстрее (несколько минут).