我知道一些關於ruby的方式來處理對象和引用。替換的東西,等...紅寶石和參考。使用fixnums
我知道它在fixnum工作,導致var是fixnum。但是我想改變一個函數中的fixnum的值,並且該值在ouside var中改變。
我該怎麼做?
我想我可以使用像這樣的字符串「1」,但這很髒。
我知道一些關於ruby的方式來處理對象和引用。替換的東西,等...紅寶石和參考。使用fixnums
我知道它在fixnum工作,導致var是fixnum。但是我想改變一個函數中的fixnum的值,並且該值在ouside var中改變。
我該怎麼做?
我想我可以使用像這樣的字符串「1」,但這很髒。
你可以傳遞一個數組與一個單一的數字,如[1]
,或像{value: 1}
哈希。由於您的號碼本身仍然是一個號碼,但比一個新班級的開銷更少,所以它不像字符串那麼醜陋...
但是數組是對象,那麼如何才能創建一個數組而不僅僅是一個裸露的對象,從而減少開銷?在Ruby實現中對數組有一些瘋狂的優化嗎? – tjarratt 2012-02-09 22:21:26
我的意思是實現開銷,而不是執行開銷。我將這些與創建一個新班級進行比較,就像在謝苗的回答中一樣。另外,在Ruby中,我們調用哈希,而不是對象... – 2012-02-10 03:21:34
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
希望這有助於。
不完全的。一切都是一個對象,它總是傳遞價值,但價值永遠是一個參考。問題是Fixnum沒有變異方法,所以你不能改變Fixnum的值。儘管你可以改變一個傳遞給方法的字符串:'def pancakes(str)str <<'pancakes'end'然後's ='有一些';煎餅;舉例來說。解決方案雖然有意義。 – 2012-02-06 21:39:28
啊,對,謝謝。把不可變對象看作簡單的值就太簡單了。 – tjarratt 2012-02-06 22:53:59
@tjarratt:那是因爲當它們是不可變的時候,不可能區分這個值是直接傳遞的還是通過了對該值的引用。只有當對象在方法外部發生變異時才能觀察到差異,但不可變對象不能被突變。 – 2012-02-07 01:16:49
當我製作遊戲時,我遇到了同樣的問題。有一個數字分數表示你殺了多少殭屍,並且我需要手動保持它在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
這可能是一個好主意,使用'SimpleDelegator'。看到我對這個類似問題的答案:http://stackoverflow.com/questions/9130994/generic-way-to-replace-an-object-in-its-own-method – 2012-02-07 04:52:20
在這種簡單的情況下,我寧願明確暴露我需要的方法。但是如果你需要一個對象來擁有所有的數字方法,使用Simple Delegator可能是一個不錯的選擇。 – 2012-02-07 18:28:47
請提供您正在嘗試執行的操作的代碼。你的問題很混亂。 – Gazler 2012-02-06 21:18:50
[通用方法來替換它自己的方法中的對象](http://stackoverflow.com/questions/9130994/generic-way-to-re-place-an-object-in-its-own-method) – 2012-02-07 01:17:01