Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Ruby中获取对象的名称?_Ruby On Rails_Ruby_Object_Self - Fatal编程技术网

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

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

我想用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在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!"