2013-03-11 19 views
-3

我試圖調整Ruby/Rails函數中的變量。標準的東西,許多其他語言。如何在Ruby中就地替換數字對象

在C:

void change(int *io){ 
    *io = 1; 
} 

現在我們都知道,Ruby是通過引用傳遞(笑臉)。這一點的代碼完美的作品:

def tester() 
    value = 'dave' 
    test_replace(value) 
    p value.to_s; 
end 

def test_replace(ioValue) 
    ioValue.replace 'test' 
end 

輸出是'測試'。

所以問題是:固定數字沒有替換方法。它們的傳遞方式與其他值不同。

所以我的問題是:如何在Ruby中「io」一個「int」?

def tester() 
    value = 10 
    test_replace(value) 
    p value.to_s; 
end 

def test_replace(ioValue) 
    ioValue.replace 15 
end 

這引發了

未定義的方法'取代」爲10:Fixnum對象

+1

不是真的對象?他們就是我們所說的不變的。 – oldergod 2013-03-11 23:58:43

+0

請不要評論這個例子..這個問題100%做作。另外通過價值的東西已經在其他SO條目中得到解決:) – baash05 2013-03-11 23:58:58

+0

爲什麼這是投票?我的意思是老實說,通過參考是一件真實的事情?羽絨球只是困擾我的鼻涕。 – baash05 2013-03-12 00:17:14

回答

2

實際上有兩種方法可以做到這一點:在一個對象

  1. 總結
  2. 裹入陣列
  3. 創建一個mutable-int代理對象

選項二很容易,我不會舉一個例子。選項1將如下所示:

class IntRef < BasicObject 
    def initialize(i) 
    @int = i 
    end 
    def replace(v) 
    @int = v 
    end 
    def method_missing(name, *args, &block) 
    @int.send(name, *args, &block) 
    end 
end 

或者選項三:代理對象!

class MutableInt < BasicObject 
    def initialize(i) 
    @int = i 
    end 
    def method_missing(name, *args, &block) 
    v = @int.send(name, *args, &block) 
    if(v.is_a?(::Fixnum)) 
     @int = v 
     return self 
    end 
    v 
    end 
end 

警告:什麼,什麼你做這個代理棍棒和改變的對象。謹防。

+0

這是胡桃醜陋..但有效......我希望其他人有不同的方式..我不想在函數之外編寫代碼來支持更改值。特別是因爲我在幾個地方使用價值..謝謝:) – baash05 2013-03-12 00:07:12

+0

@daveatflow:對不起,但這是最好的方法。沒有更好的方法來做到這一點。 – Linuxios 2013-03-12 00:08:55

+0

@daveatflow:其實,等一下。我有一個想法...(惡魔般的笑聲):)。 – Linuxios 2013-03-12 00:10:16

5

@Linuxios在他關於價值傳遞的解釋中是正確的,但他的解決方法相當尷尬。這是很容易框與支持SimpleDelegator一個Fixnum一個取代:

class NumberBox < SimpleDelegator 
    alias_method :replace, :__setobj__ 
    class <<self; alias_method :[], :new; end 
end 

def tester() 
    value = NumberBox[10] 
    test_replace(value) 
    p value.to_s; 
end 

def test_replace(ioValue) 
    ioValue.replace 15 
end 

在上面value將完全一樣的對象時,它代表們,在初始化(與::newNumberBox::[])建立的,除了它也支持__setobj__方法及其別名replace,它將一個新對象綁定爲代表。

+0

尼斯解決方案!我從來沒有聽說過SimpleDelegator。 +1! – Linuxios 2013-03-12 02:36:01

0

現在我們都知道,Ruby是通過參考

相反傳球,Ruby是路過的唯一價值。沒有通過參考。與Java,Python等相同

相關問題