Forum: IronRuby override method_missing()

Posted by Lewis L. (lewis_l)
on 2011-10-19 17:24
Hi,
Is there a way to override the method_missing method and keep the
SetVariable lookup behavior from ScriptScope?
For example,

in C#
aScriptScope.SetVariable("a", "some_value")

in Ruby
p a
=> "some_value"

But if I do,

class << self
  def method_missing(sym, *args, &block)
    case (sym)
    when :some_case
       do_something
    else
       super #try to fallback to the original
    end
  end
end

or

class << self
  alias :old_method_missing :method_missing
  def method_missing(sym, *args, &block)
    case (sym)
    when :some_case
       do_something
    else
       old_method_missing(sym, *args, &block) #try to fallback to the
original
    end
  end
end

p a
=> NameError: undefined local variable or method 'a' for main:Object
Posted by Tomas Matousek (Guest)
on 2011-10-19 18:13
(Received via mailing list)
Might be a bug.
Posted by Lewis L. (lewis_l)
on 2011-10-19 19:00
Thanks a lot. At least I won't be killing myself trying to figure out 
what I missed. FYI, I tested on version 1.1 and 1.1.3 and they seem to 
have the same issue.
Since we are on the subject, I wonder if you can spare some of your time 
help me understand this:

As far as I understand, the global environment is actually a singleton 
'main' Object. The function defined in the global scope should be 
translated to private method of Object class which is what it shows in 
iirb.bat. Not sure why ir.exe as well as the code in the ScriptEngine 
does not behave that way.

c:\Program Files\IronRuby 1.1\bin>ir
IronRuby 1.1.3.0 on .NET 4.0.30319.225
Copyright (c) Microsoft Corporation. All rights reserved.

>>> def global_hi
... puts 'hi'
... end
=> nil
>>> class A
...   def hi
...     global_hi
...   end
... end
=> nil
>>> A.new.hi
(ir):3:in `hi': undefined method `global_hi' for #<A:0x0000056> 
(NoMethodError)
        from (ir):1

>>> self.method(:global_hi)
=> #<Method: Object(#<Class:#<Object:0x0000058>>)#global_hi>
>>> exit

---------------------------------------------------------------------

c:\Program Files\IronRuby 1.1\bin>iirb
irb(main):001:0> def global_hi
irb(main):002:1>   puts 'hi'
irb(main):003:1> end
=> nil
irb(main):004:0> class A
irb(main):005:1>   def hi
irb(main):006:2>     global_hi
irb(main):007:2>   end
irb(main):008:1> end
=> nil
irb(main):009:0> A.new.hi
hi
=> nil
irb(main):010:0> self.method(:global_hi)
=> #<Method: Object#global_hi>
irb(main):011:0>
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.