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