更改方法中传递的变量

Imn*_*erd 5 ruby methods reference

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

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

void makeMeABanana(int *gorilla) { }
Run Code Online (Sandbox Code Playgroud)

我怎么能在Ruby中做这样的事情?

Pet*_*ter 5

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


Sha*_*nak 2

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

但是,如果我们显式传递绑定,则可以编写类似交换的函数。这是一个简单的尝试:

 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
Run Code Online (Sandbox Code Playgroud)

这确实有效!但它有一个很大的缺点。“a”和“b”的旧值被插入到字符串中。只要旧值是简单的文字(例如整数或字符串),那么最后两个 eval 语句将如下所示: eval "a = 33", vars"。但是如果旧值是复杂对象,则 eval 将如下所示就像 eval "a = #", vars. 哎呀,对于任何无法在字符串往返过程中幸存下来的值,这都会失败。

引用自:http ://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc