一個有趣的問題: 如何獲取引用名?

我們知道, 對於
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來實現變量交換, 這個不是要討論的問題)
發佈了4 篇原創文章 · 獲贊 1 · 訪問量 2459
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章