如何在Ruby中获取对象的名称?

时间:2011-09-15 02:05:59

标签: ruby-on-rails ruby object self

我想在Ruby中为我的Rails应用程序编写一个简单的调试方法:

foo = "bar"
debug(foo)

debug方法将返回字符串"foo: bar"

如何在Ruby中获取对象的名称(在本例中为foo)?

使用Ruby 1.92。

感谢。

5 个答案:

答案 0 :(得分:3)

结帐log_buddy

来自自述文件:

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。