2009-01-20 37 views
3

在PHP中,可以让两个变量指向相同的数据。Ruby是否支持像PHP这样的var引用?

$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分钟的阅读,在网上搜索,并在办公室询问,我们仍然失去了......大声笑

回答

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 
+0

请注意,b.dup是浅拷贝。您可以使用a = Marshal.load(Marshal.dump(b))作为深层副本。 – 2009-01-20 10:20:12

1

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

3

变量和常量是指向内存位置。 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

同意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" 
相关问题