我想在Ruby中为我的Rails应用程序编写一个简单的调试方法:
foo = "bar"
debug(foo)
debug方法将返回字符串"foo: bar"
。
如何在Ruby中获取对象的名称(在本例中为foo)?
使用Ruby 1.92。
感谢。
答案 0 :(得分:3)
来自自述文件:
a = "foo"
@a = "my var"
@@bar = "class var!"
def bark
"woof!"
end
d { a } # logs "a = 'foo'"
d { @a } # logs "@a = 'my var'"
d { @@bar } # logs "@@bar = 'class var!'"
d { bark } # logs "bark = woof!"
答案 1 :(得分:2)
def debug(var,val)
puts "#{var}: #{val}"
end
debug("foo",foo)
答案 2 :(得分:1)
为了完整起见,您应该不这样做。这是一个可怕的想法,并将以各种方式打破:
根据Chris Shea,Flanagan和Matz的 The Ruby Programming Language 中的第8.6节有这个片段(为了清晰起见添加了评论):
class Object
def get_name #do not use this brittle technique
line_number = caller[0].split(':')[1].to_i
line_executed = File.readlines(__FILE__)[line_number-1]
line_executed.match(/(\S+)\.get_name/)[1] #BAD IDEA: parsing Ruby with regular expressions
end
end
通过查找调用get_name
的行号,从当前运行的文件中读取该行并尝试使用正则表达式解析名称来“工作”变量。抱歉Zalgo,不尝试用正则表达式解析Ruby!
答案 3 :(得分:0)
我不确定你是否能够可靠地执行此操作,特别是跨Ruby实现。这样做的主要目的是什么?消除手动生成语义信息?
正如其他人所说,只是打印变量名称本身并不一定有用:没有上下文,它可能没有比转储变量更有帮助。
似乎更好的想法是使用正常的日志记录机制,并提供具有上下文意义的信息以及符号值。
或者只使用pry。
答案 4 :(得分:0)
与往常一样, 有一个宝石: http://thinkrelevance.com/blog/2009/09/23/quick-and-easy-logging-with-logbuddy.html
它将输出到stdout。
感谢Andrew Grimm(上图)和Leventix。