Поддерживает ли Ruby ссылки на var, такие как PHP? - PullRequest
3 голосов
/ 20 января 2009

В PHP вы можете заставить две переменные указывать на одни и те же данные.

$a = 'foo';
$b = 'bar';
$a =& $b;
echo $a // Outputs: bar
echo $b // Outputs: bar

То, что мы пытаемся сделать в Ruby, установлено @app_session равным session[@current_app[:uid]]. Таким образом, нам нужно иметь дело только с @app_session в нашем приложении, и все автоматически сохраняется в сеансе.

Есть ли способ сделать это в Ruby? После 15 минут чтения, поиска в Google и расспросов здесь, в офисе, мы все еще потеряны ... LOL

Ответы [ 4 ]

7 голосов
/ 20 января 2009

Все переменные в Ruby являются ссылками на объект.

a = b

означает, что a и b указывают на один и тот же объект. Вот почему, когда вы хотите скопировать данный объект, вам нужно написать

a = b.dup

Запись

@app_session = session[@current_app[:uid]]

указывает на тот же объект, поэтому с вами все будет в порядке.

РЕДАКТИРОВАТЬ: вы можете проверить это следующим образом:

irb(main):001:0> a = 1
=> 1
irb(main):002:0> b = a
=> 1
irb(main):004:0> p a.object_id
3
=> nil
irb(main):005:0> p b.object_id
3
3 голосов
/ 20 января 2009

Переменные и константы являются указателями на ячейки памяти. Ruby делает это по умолчанию, поэтому вам не нужно «эмулировать» поведение PVP вручную. Доказательства:

a = "hi"
b = a
a.upcase!
puts a
# => "HI"
puts b
# => "HI"

Что касается вашего @app_session вопроса, я бы сделал что-то вроде этого:

class ApplicationController < ActionController::Base
  def app_session
    session[@current_app[:uid]]
  end
end

Это позволяет вам вызывать метод app_session, чтобы впоследствии вы могли легко изменить реализацию. (Скажем, если вы обнаружите, что вам нужно использовать константу вместо переменной экземпляра или что-то еще.)

2 голосов
/ 20 января 2009

Согласен с Смертельным и Келтией. Стоит отметить одну вещь:

Когда вы присваиваете некоторую строку переменной, вы ВСЕГДА создаете новый объект String, делая это.

a = "foo"  # Create a new String object and make a refer this object.
b = "bar"  # Create a new String object and make b refer this object.
a = b      # Make b refer the object created in the first step.
a = "blah" # Create a new String object and make a refer this object. (!)
puts b     # But(!) b is still "foo", because it still refers the "foo" object.
# => "foo"
1 голос
/ 20 января 2009

Разве это не значение по умолчанию для всех объектов ruby? Не имеет смысла каждый раз копировать объект.

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