2009-01-20 116 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" 
相關問題