Ruby on rails 如何在Ruby中获取对象的名称?
我想用Ruby为我的Rails应用程序编写一个简单的调试方法:Ruby on rails 如何在Ruby中获取对象的名称?,ruby-on-rails,ruby,object,self,Ruby On Rails,Ruby,Object,Self,我想用Ruby为我的Rails应用程序编写一个简单的调试方法: foo = "bar" debug(foo) 调试方法将返回字符串“foo:bar” 如何在Ruby中获得对象的名称(本例中为foo) 在Ruby 1.92中工作 谢谢。为了完整起见,这里有一种方法你应该而不是这样做。这是一个可怕的想法,并将以各种方式打破: def debug(var,val) puts "#{var}: #{val}" end debug("foo",foo) 据了解,Flanagan和Matz在Rub
foo = "bar"
debug(foo)
调试方法将返回字符串“foo:bar”
如何在Ruby中获得对象的名称(本例中为foo)
在Ruby 1.92中工作
谢谢。为了完整起见,这里有一种方法你应该而不是这样做。这是一个可怕的想法,并将以各种方式打破:
def debug(var,val)
puts "#{var}: #{val}"
end
debug("foo",foo)
据了解,Flanagan和Matz在Ruby编程语言的第8.6节中有这样一段代码(为了清晰起见添加了注释):
它通过查找调用
get_name
的行号来“工作”,从当前运行的文件中读取该行,并尝试使用正则表达式解析出变量的名称。很抱歉,不要试图用正则表达式解析Ruby 我不确定您是否能够可靠地做到这一点,尤其是在Ruby实现中。你这样做的主要目的是什么?要消除手动生成语义信息
正如其他人所说,仅仅打印变量名本身并不一定有用:没有上下文,它可能不会比转储变量更有用
似乎更好的办法是使用正常的日志机制,并提供有上下文意义的信息以及符号值
或者直接使用。退房
自述文件:
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!"
与Ruby一样,有一个宝石: 它将输出到标准输出
多亏了Andrew Grimm(上图)和Leventix。为什么不写:debug(“foo”)而不是debug(foo)?这里有一个重要的区别,一开始可能看起来很琐碎:“foo”不是对象的名称。“foo”是变量的名称。多个变量可能指向同一对象。这就是为什么这不像你想象的那么简单。对不起,这只是一个糟糕的想法,而且毫无意义。使用文字记录调试消息,而不是变量名。相关问题:我不认为这是一个糟糕的主意,如果我知道某个方法中出现了问题,但真的看不到它在哪里,我将开始对所有内容进行垃圾邮件处理,试图找到没有意义的值。问题中所问的这类问题使得该方法更加简单。为了正确工作,
debug
的调用者必须调用并将其传递给debug
,以便debug
可以将其传递给eval
。否则,eval
可能位于错误的范围内,无法查看foo
的值。更多信息请参见课堂。哦,对了,现在我记得必须这样做,这是多么痛苦。修正了采用更可靠的方法的答案。哦,我想说的是,这种简单技术的优点之一是,一旦你开始使用它,你很可能会发现你实际上经常想要输出更多的信息,而不仅仅是名字。像debug(“开始导入之前的foo”,foo)
和debug(“清除缓存之后的foo”,foo)
…否决投票的原因是什么?就其本身而言,有些毫无意义。教育我。是的,如果你搜索“pry rails控制台”,你也可以用它作为你的控制台。当然,这会导致你的浏览器请求超时,除非你很快。不过真的很方便。@DaveNewton:我投了反对票,因为这个问题很合理,而且已经有了“不要做”的答案。(考虑到它的机制和限制,我很好奇它在各种实现中的效果如何。)
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!"