如何使用方法更改變量的內容?也許我不是這樣說的。什麼是獲得像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