Error message, hide class name

irb(main):005:0> class X
irb(main):006:1> def inspect
irb(main):007:2> “hey”
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> x = X.new.nomethod
NoMethodError: undefined method `nomethod’ for hey:X
from (irb):10

Anyone know how I can get rid of the ‘:X’ after ‘hey’? I’ve tried:

class X
def self.name; ‘’; end
def self.to_s; ‘’; end
def class; ‘’; end
end

Where is it getting the class name?

Thanks,
T.

On Nov 19, 11:50 am, Trans [email protected] wrote:

Anyone know how I can get rid of the ‘:X’ after ‘hey’? I’ve tried:

class X
def self.name; ‘’; end
def self.to_s; ‘’; end
def class; ‘’; end
end

Where is it getting the class name?

FYI, I decided to just chomp off everything after the ‘for’, so no big
deal. But I still don’t understand where the error message was getting
the class name.

T

On Nov 19, 2008, at 08:50 , Trans wrote:

Anyone know how I can get rid of the ‘:X’ after ‘hey’? I’ve tried:
the problem isn’t inspect or anything else to do with X, it is
method_missing. the default method_missing is raising with a message
like:

“undefined method `#{msg}’ for #{self.inspect}:#{self.class}”

So you can attack the ‘problem’ at the source:

2008/11/19 Trans [email protected]:

But I still don’t understand where the error message was getting
the class name.

Tom, the so-called class path seems to be buried deep inside
unaccessible instance variables of the class. For a workaround use a
“#” as the first character of the inspect result:

class X
def inspect
#hey
end
end

X.new.x # => undefined method `x’ for #hey (NoMethodError)

Regards,
Pit

On Nov 20, 3:48 am, “Pit C.” [email protected] wrote:

def inspect
  "#hey"
end

end

X.new.x # => undefined method `x’ for #hey (NoMethodError)

That’s interesting!

Thanks Pit. I think I can use that.

T.

On Nov 20, 4:29 am, Ryan D. [email protected] wrote:

Anyone know how I can get rid of the ‘:X’ after ‘hey’? I’ve tried:

the problem isn’t inspect or anything else to do with X, it is
method_missing. the default method_missing is raising with a message
like:

“undefined method `#{msg}’ for #{self.inspect}:#{self.class}”
^^^^^^^^^^
Which is why I thought I should be able to override #class. And was
surprised that it did not work. Nevertheless…

So you can attack the ‘problem’ at the source:

class Object; def method_missing(*a); raise NoMethodError, “haha!
stupid!”; end; end
=> nil
bork
NoMethodError: haha! stupid!
from (irb):3:in `method_missing’
from (irb):4

That’s a better approach --at least in the case of NoMethodError.

Thanks, Ryan.

T.