红宝石和参考。使用fixnums

时间:2012-02-06 21:18:06

标签: ruby pass-by-reference fixnum

我对ruby处理对象和引用的方式有所了解。更换东西,等等......

我知道它在fixnum上工作,导致var是fixnum。但我希望在函数内部更改fixnum的值,并在ouside var中更改值。

我该怎么做?

我想我可以使用像这样的字符串“1”,但这很脏。

3 个答案:

答案 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