让Ruby告诉你自己的名字

今天在看论坛,无聊看到一个无聊的人在问这么一个无聊的问题--

如何得到变量名字?高手指下路
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

嗯,纯属跑步完无聊閑扯

TAGS:Ruby

8 COMMENTS >>LEAVE<<

  1. smilejustforfan

    还有个不错的变量名 md

  2. ABitNo
    @smilejustforfan

    嗯,我竟没考虑到这一层面,只是在想MatchData的缩写--

  3. wayne

    我很喜欢那几个变量名

  4. ABitNo
    @wayne

    你们都心怀鬼胎,我才没那么想呢。。。

  5. ssword

    好玩 !

  6. cactis

    知道哪個方法調用,相關的變數是哪幾個,可以增加除錯的便利,不是嗎?

  7. ABitNo
    @cactis

    但是现在的debug程序已经足够精确了,定位到哪一行,然后告诉你是什么变量出错,只是不告诉你变量的名字,因为就像上面说的,变量名不能代表什么

  8. Firm

    额,有那么点意思

LEAVE A RESPONSE >>CANCEL<<

loader