2012-02-06 39 views
2

我知道一些關於ruby的方式來處理對象和引用。替換的東西,等...紅寶石和參考。使用fixnums

我知道它在fixnum工作,導致var是fixnum。但是我想改變一個函數中的fixnum的值,並且該值在ouside var中改變。

我該怎麼做?

我想我可以使用像這樣的字符串「1」,但這很髒。

+6

請提供您正在嘗試執行的操作的代碼。你的問題很混亂。 – Gazler 2012-02-06 21:18:50

+0

[通用方法來替換它自己的方法中的對象](http://stackoverflow.com/questions/9130994/generic-way-to-re-place-an-object-in-its-own-method) – 2012-02-07 01:17:01

回答

4

你可以傳遞一個數組與一個單一的數字,如[1],或像{value: 1}哈希。由於您的號碼本身仍然是一個號碼,但比一個新班級的開銷更少,所以它不像字符串那麼醜陋...

+0

但是數組是對象,那麼如何才能創建一個數組而不僅僅是一個裸露的對象,從而減少開銷?在Ruby實現中對數組有一些瘋狂的優化嗎? – tjarratt 2012-02-09 22:21:26

+0

我的意思是實現開銷,而不是執行開銷。我將這些與創建一個新班級進行比較,就像在謝苗的回答中一樣。另外,在Ruby中,我們調用哈希,而不是對象... – 2012-02-10 03:21:34

5

Ruby將始終通過引用(因爲所有東西都是對象),但Fixnum缺少允許您改變值的任何方法。有關更多詳細信息,請參閱「void foo(int &x) -> Ruby? Passing integers by reference?」。

您可以返回一個值,你然後將分配給您的變量,像這樣:

a = 5 
def do_something(value) 
    return 1 #this could be more complicated and depend on the value passed in 
end 
a = do_something(a) 

,或者你可以包裝在一個對象的值,比如哈希值,並將它更新的方式。

a = {:value => 5} 
def do_something(dict) 
    dict[:value] = 1 
end 
do_something(a) #now a[:value] is 1 outside the function 

希望這有助於。

+5

不完全的。一切都是一個對象,它總是傳遞價值,但價值永遠是一個參考。問題是Fixnum沒有變異方法,所以你不能改變Fixnum的值。儘管你可以改變一個傳遞給方法的字符串:'def pancakes(str)str <<'pancakes'end'然後's ='有一些';煎餅;舉例來說。解決方案雖然有意義。 – 2012-02-06 21:39:28

+0

啊,對,謝謝。把不可變對象看作簡單的值就太簡單了。 – tjarratt 2012-02-06 22:53:59

+1

@tjarratt:那是因爲當它們是不可變的時候,不可能區分這個值是直接傳遞的還是通過了對該值的引用。只有當對象在方法外部發生變異時才能觀察到差異,但不可變對象不能被突變。 – 2012-02-07 01:16:49

2

當我製作遊戲時,我遇到了同樣的問題。有一個數字分數表示你殺了多少殭屍,並且我需要手動保持它在Player(增加分數),ScoreBar和ScoreScreen(顯示分數)之間保持同步。我發現溶液創建一個單獨的類,將包裹的價值和它發生變異比分:

class Score 
    def initialize(value = 0) 
    @value = value 
    end 

    def increment 
    @value += 1 
    end 

    def to_i 
    @value 
    end 

    def to_s 
    @value.to_s 
    end 
end 
+0

這可能是一個好主意,使用'SimpleDelegator'。看到我對這個類似問題的答案:http://stackoverflow.com/questions/9130994/generic-way-to-replace-an-object-in-its-own-method – 2012-02-07 04:52:20

+0

在這種簡單的情況下,我寧願明確暴露我需要的方法。但是如果你需要一個對象來擁有所有的數字方法,使用Simple Delegator可能是一個不錯的選擇。 – 2012-02-07 18:28:47