如何使用方法更改变量的内容?也许我不是这样说的。什么是获得像C中的变量的引用的方法?例如:更改方法中传递的变量
// main stuff
int gorilla = 29;
makeMeABanana(&gorilla);
void makeMeABanana(int *gorilla) { }
我该如何在Ruby中做这样的事情?
如何使用方法更改变量的内容?也许我不是这样说的。什么是获得像C中的变量的引用的方法?例如:更改方法中传递的变量
// main stuff
int gorilla = 29;
makeMeABanana(&gorilla);
void makeMeABanana(int *gorilla) { }
我该如何在Ruby中做这样的事情?
最近在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
你不应该这么做 - 你只是将完全适用于C的技术移植到Ruby,而不适合他们。有几种奇特的方法可以解决这个问题(例如,使用Proc关闭你的调用命名空间或者eval),但是除非你确切地知道你在做什么,否则它们在Ruby中通常是不适当的。
彼得,很好的答案。你认为Ruby方式的一个例子还是两个很好?回想起新的价值。 – 2011-05-05 23:04:06
整数都是对象,有一个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)变成别的东西。
为什么?不知道你想在这里完成什么。 Ruby和C在这方面的表现完全不同 - 例如,Ruby中没有void函数这样的事情 - 更具体的例子确实会有所帮助。 – 2011-05-05 23:02:12