Ruby支持像PHP这样的var引用吗?

时间:2009-01-20 09:59:06

标签: php ruby reference

在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分钟的阅读,谷歌搜索,并在办公室询问,我们仍然迷路了......哈哈

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

变量和常量是指向内存位置的指针。 Ruby通过defaut执行此操作,因此您无需手动“模拟”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 :(得分:2)

同意leethal和Keltia。只需要指出一点:

当您为变量指定一些字符串时,您总是通过这样做来创建一个新的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"

答案 3 :(得分:1)

这不是所有ruby对象的默认值吗?每次复制一个对象是没有意义的。