2011-05-05 85 views
5

如何使用方法更改变量的内容?也许我不是这样说的。什么是获得像C中的变量的引用的方法?例如:更改方法中传递的变量

// main stuff 
int gorilla = 29; 
makeMeABanana(&gorilla); 

void makeMeABanana(int *gorilla) { } 

我该如何在Ruby中做这样的事情?

+0

为什么?不知道你想在这里完成什么。 Ruby和C在这方面的表现完全不同 - 例如,Ruby中没有void函数这样的事情 - 更具体的例子确实会有所帮助。 – 2011-05-05 23:02:12

回答

2

最近在ruby-talk邮件列表中,有人询问了编写交换函数,其中swap(a,b)将交换变量“a”和“b”的值。通常情况下,这不能在Ruby中完成,因为交换函数不会引用调用函数的绑定。

但是,如果我们明确地传递绑定,那么可以编写一个类似swap的函数。这是一个简单的尝试:

def swap(var_a, var_b, vars) 
    old_a = eval var_a, vars 
    old_b = eval var_b, vars 
    eval "#{var_a} = #{old_b}", vars 
    eval "#{var_b} = #{old_a}", vars 
    end 

    a = 22 
    b = 33 
    swap ("a", "b", binding) 
    p a       # => 33 
    p b       # => 22 

这实际上工作!但它有一个很大的缺点。 “a”和“b”的旧值被插入到一个字符串中。只要旧值是简单文字(例如整数或字符串),那么最后两个eval语句看起来像:eval“a = 33”,vars“。但是如果旧值是复杂对象,那么eval会看起来像。像EVAL“A =#”,乏哎呀,这将失败对于无法生存往返于字符串和背部的任何值

来自简称:http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc

5

你不应该这么做 - 你只是将完全适用于C的技术移植到Ruby,而不适合他们。有几种奇特的方法可以解决这个问题(例如,使用Proc关闭你的调用命名空间或者eval),但是除非你确切地知道你在做什么,否则它们在Ruby中通常是不适当的。

+0

彼得,很好的答案。你认为Ruby方式的一个例子还是两个很好?回想起新的价值。 – 2011-05-05 23:04:06

0

整数都是对象,有一个id ,像红宝石一切他们实现这样的:

p (0..10).map{|n| n.object_id} 
#=>[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21] 

所有其他对象甚至已经OBJECT_ID号有没有办法改变7(OBJ。 ect_id 15)变成别的东西。