Что-то вроде ссылки на переменную

0

Как я могу это сделать в 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 есть что-то подобное?

Теги:

2 ответа

4

Вы просто заменить сдерживание экземпляра Array с #replace методом, так как = оператор присваивания только Ассингом к имени переменного Иным например:

a = [1,2,3]
h = {vara: a} 
h[:vara]
# => [1,2,3]

a.replace [42,43,44]
h[:vara]
# => [42, 43, 44]
  • 0
    Ах, черт возьми, я собирался опубликовать свою копию этого. :)
  • 0
    Кстати, это Array#replace , а не Hash#replace .
Показать ещё 2 комментария
3

У 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, ссылка ломается.

  • 0
    Проблема с replace состоит в том, что это не в каждом классе. Поскольку я проверил только String , Array , Hash содержат этот метод. +1, потому что это работает для некоторой части классов ruby. пс. ТАК говорит, что вы были быстрее (несколько минут).
  • 0
    Я был первым, да. Но @ Малъ отправил код с заменой за несколько секунд до того, как я обновил свой ответ. :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню