a = 100
這樣的一條語句, a是一個指向 "100" 這個對象的引用. 那麼, 如何根據a得到它的名字"a"或者符號:a ?
我現在實現了一個'swap'函數,它的作用是交換兩個變量的值, 由於Ruby沒有類似C的'指針',所以這個swap實現起來還真有點麻煩:
a = 100
b = 200
def swap(x, y, &block)
bind = block.binding
vx = eval("lambda { #{x} }", bind).call
vy = eval("lambda { #{y} }", bind).call
eval("lambda {|v| #{y.to_s} = v }", bind).call(vx)
eval("lambda {|v| #{x.to_s} = v }", bind).call(vy)
end
puts "a = #{a}, b = #{b}"
swap(:a, :b){}
puts "a = #{a}, b = #{b}"
好了, 這個swap有兩個缺陷:
1) 爲了獲取caller's binding, 需要帶一個空的閉包. 不過這個問題好解決, rails中有Binding.of_caller的實現,用它就可以省去那個空閉包.
2) 爲了獲取待交換的變量名, 傳入swap的參數不能是a,b本身,而需要對應的symbol或string, 看起來有點彆扭. 如果存在一個函數get_ref_name(x)返回x的名字, 那麼問題就解決了.
[b]那麼, get_ref_name 存在麼? 該如何實現?[/b]
(注: 不要告訴我用a,b = b,a來實現變量交換, 這個不是要討論的問題)