输出nil:引发异常时的NilClass

时间:2013-01-31 11:29:31

标签: ruby

当您调用对象上不存在的方法时,将引发NoMethodError,即

Object.new.foo

将输出:

  

NoMethodError:#

的未定义方法`foo'

,而

nil.foo

将输出:

  

NoMethodError:nil的未定义方法`foo':NilClass

我想在提出我自己的例外时复制这种行为,即

foo = Object.new
raise StandardError, "#{foo} triggered an error"

将输出:

  

StandardError:#<Object:0xbf37748>触发了错误

这是我想要的。

不幸的是

foo = nil
raise StandardError, "#{foo} triggered an error"

将输出

  

StandardError:触发错误

这可能是因为nil.to_s""。如何将nil:NillClass作为输出?

2 个答案:

答案 0 :(得分:1)

raise StandardError, "#{foo.inspect}:#{foo.class} triggered an error"

编辑。您似乎希望nil表现得与众不同。因此,只需在raise语句中使用其他方法即可。

class Object; def my_inspect; inspect end end
class NilClass; def my_inspect; "#{inspect}:#{self.class}" end end

raise StandardError, "#{foo.my_inspect} triggered an error"

答案 1 :(得分:0)

我相信你可以致电foo.class。类似的东西:

raise StandardError, "#{foo.class} triggered an error"

这只会输出NilClass,但这应该足够提供信息。