让Ruby告诉你自己的名字
POSTED AT: 2010-05-27 13:47:10 UTC |
POSTED IN: Ruby/Rails |
8 COMMENTS
今天在看论坛,无聊看到一个无聊的人在问这么一个无聊的问题--
如何得到变量名字?高手指下路
var = 1;
puts "var = #{var}"
我想puts的时候不用输入var
通过var.xxx 得到 字符串"var"
后面的人就告诉他这是不可行的,他就对Ruby失望了。。。不过,可不是Ruby不行哟,不能对Ruby失望,她可是有随时检测自身状况的本领啊
# my_name.rb module Kernel undef my_name if respond_to?(:my_name) def my_name md = caller[0].match(/(.+):(\d+):/) file_name, line_number = md[1], md[2] line = `awk "#{line_number}==NR" #{file_name}` line.match(/(\w+)\.my_name/)[1] rescue 'FUCK GFW' end end
来小解释一下,总有那么一些函数需要知道是谁调用了自己,于是Ruby又作了回好人。
Kernel中内置的caller方法可以返回方法的调用栈,这是一个字符串数组,其第一个元素就是方法的直接调用者
于是,这个无聊的问题解决了。为什么说这个问题无聊呢,因为我想不出有什么地方需要用到这种方法,也许依然是我太寡聞了吧。。。
我们用上面的my_name方法看看效果如何
require 'my_name' fuck = "gfw" puts "#{fuck.my_name} #{fuck}" # => fuck gfw
啊,成功的fuck了GFW,Ruby立功了!!!
像这种获取变量名称基本是毫無意义的,因为变量名本来就毫無意义,你比如
b = 3
这时你或许认为变量名应该是b,那我们正常的犯一次贱
s = b
经过这次sb变换,你认为变量名应该是s还是b呢TAT
嗯,纯属跑步完无聊閑扯
本文基于 署名-非商业性使用-禁止演绎 2.5 中国大陆 发布
TAGS:Ruby
8 COMMENTS >>LEAVE<<
-
还有个不错的变量名 md
-
@smilejustforfan
嗯,我竟没考虑到这一层面,只是在想MatchData的缩写--
-
我很喜欢那几个变量名
-
@wayne
你们都心怀鬼胎,我才没那么想呢。。。
-
好玩 !
-
知道哪個方法調用,相關的變數是哪幾個,可以增加除錯的便利,不是嗎?
-
@cactis
但是现在的debug程序已经足够精确了,定位到哪一行,然后告诉你是什么变量出错,只是不告诉你变量的名字,因为就像上面说的,变量名不能代表什么
-
额,有那么点意思