我对 ruby 处理对象和引用的方式有所了解。替换的东西,等等...
我知道它不能在 fixnum 上工作,因为 var 是 fixnum。但我希望更改函数内的 fixnum 的值,并且该值在 ouside var 中更改。
我怎样才能做到这一点 ?
我想我可以使用像“1”这样的字符串,但这很脏。
我对 ruby 处理对象和引用的方式有所了解。替换的东西,等等...
我知道它不能在 fixnum 上工作,因为 var 是 fixnum。但我希望更改函数内的 fixnum 的值,并且该值在 ouside var 中更改。
我怎样才能做到这一点 ?
我想我可以使用像“1”这样的字符串,但这很脏。
Ruby 将始终通过引用传递(因为一切都是对象),但 Fixnum 缺少任何允许您改变值的方法。有关详细信息,请参阅“ void foo(int &x) -> Ruby?通过引用传递整数? ”。
您可以返回一个值,然后将其分配给您的变量,如下所示:
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
希望这可以帮助。
你可以传递一个带有单个数字的数组,比如[1]
,或者像{value: 1}
. 比字符串更丑,因为你的数字本身仍然是一个数字,但比一个新类的开销少......
当我在构建游戏时,我遇到了同样的问题。有一个数字分数表示你杀死了多少僵尸,我需要手动保持 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