我对ruby处理对象和引用的方式有所了解。更换东西,等等......
我知道它在fixnum上工作,导致var是fixnum。但我希望在函数内部更改fixnum的值,并在ouside var中更改值。
我该怎么做?
我想我可以使用像这样的字符串“1”,但这很脏。
答案 0 :(得分: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)
或者你可以将你的值包装在一个对象中,例如Hash,并以这种方式更新它。
a = {:value => 5}
def do_something(dict)
dict[:value] = 1
end
do_something(a) #now a[:value] is 1 outside the function
希望这有帮助。
答案 1 :(得分:4)
您可以使用单个数字传递数组,例如[1]
或类似{value: 1}
的哈希值。比字符串更难看,因为你的数字本身仍然是一个数字,但是比新类更少的开销......
答案 2 :(得分: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