更改方法中传递的变量

时间:2011-05-05 22:56:02

标签: ruby methods reference

如何使用方法更改变量的内容?也许我不是说得对。有什么方法可以像C中那样获取变量的引用?例如:

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

void makeMeABanana(int *gorilla) { }

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

3 个答案:

答案 0 :(得分:5)

你不应该这样做 - 你只是将完全适合C到Ruby的技术移植到不再合适的地方。有几种奇特的方法(例如使用Proc关闭你的调用命名空间或eval)但它们通常不适用于Ruby,除非你确切地知道你正在做什么。

答案 1 :(得分: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 =#”,vars.Oops,这对于任何无法在往返字符串并返回的情况下都无法生存的值都会失败。

参考:http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc

答案 2 :(得分:0)

整数是具有id的对象,就像Ruby中的其他所有东西一样。它们的实现方式如下:

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

所有其他对象甚至都有object_id数字。无法将7(object_id 15)更改为其他内容。