Bug #8870
closedMethod-Missing breaking irb
Description
2.0.0p247 :001 > def method_missing m,*args; [m.to_s,args].flatten.join " "; end
=> nil
2.0.0p247 :002 > "j".happy "hh"
2.0.0p247 :001 > def method_missing *args; args.join " "; end
=> nil
2.0.0p247 :002 > "j".happy
SystemStackError: stack level too deep
from /Users/bjhaid/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/irb/workspace.rb:86
Maybe IRB bug!
2.0.0p247 :003 > def method_missing m,*args; args.join " "; end
Segmentation fault: 11
2.0.0p247 :001 > def method_missing m,*args; [m,args].flatten " "; end
=> nil
2.0.0p247 :002 > "j".happy hah
Segmentation fault: 11
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
Array#flatten tries to call #to_ary method on non-Array arguments, but the result of `m.to_s' doesn't have it, so the method_missing is called, and continues infinitely.
In short, do not redefine global method_missing method.
Updated by bjhaid (Ayodele Abejide) over 10 years ago
I do understand that its bad to use method_missing in the global space, but the behavior should be same irrespective of scope
This works:
2.0.0-p247 :002 > m "2","a","b"
=> ["2", "a", "b"]
2.0.0-p247 :003 > (m "2","a","b").class
=> Array
This breaks:
2.0.0-p247 :004 > def method_missing m,*args; args.class; end
=> nil
2.0.0-p247 :005 > m "2","a","b"
/Users/bjhaid/.rvm/scripts/irbrc.rb:32:in `initialize': can't convert String to Fixnum (String#to_int gives Class) (TypeError)
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
I know nothing about what your script does.
Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago
- Status changed from Open to Closed
- Backport deleted (
1.9.3: UNKNOWN, 2.0.0: UNKNOWN)