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
on 2011-10-19 17:24
on 2011-10-19 18:13
Might be a bug.
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 184.108.40.206 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>