Forum: IronRuby override method_missing()

B1f0a4450613766b5c931a420475cf85?d=identicon&s=25 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
Cb51033949ffccd982ae32c9f890f25a?d=identicon&s=25 Tomas Matousek (Guest)
on 2011-10-19 18:13
(Received via mailing list)
Might be a bug.
B1f0a4450613766b5c931a420475cf85?d=identicon&s=25 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>
This topic is locked and can not be replied to.