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.

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<Class>

···

On Nov 19, 11:50 am, Trans <transf...@gmail.com> wrote:

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?

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:

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:

···

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

>> 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

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

···

2008/11/19 Trans <transfire@gmail.com>:

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

> 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.

···

On Nov 20, 4:29 am, Ryan Davis <ryand-r...@zenspider.com> wrote:

That's interesting!

Thanks Pit. I think I can use that.

T.

···

On Nov 20, 3:48 am, "Pit Capitain" <pit.capit...@gmail.com> wrote:

2008/11/19 Trans <transf...@gmail.com>:

> 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)