2012-02-06 36 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