IronRuby为什么酷(1)
动态语言一般都有个特性,就是在运行时修改一个类的行为或一个类实例的,而期间源代码并没有改动。这个特性在ruby语言里叫Monkey Pathing。其实这就像是C#里的扩展方法一样,只不过远远比它强大。
假设我们有一个C#的对象实例,它有一个索引器,在C#里我们可以这样访问:
object someValue = indexer["key"]
而IL里无非是给索引器一个get_Item()方法。当我们把这个对象传递到IronRuby的时候,我就需要这样了:
someValue = $indexer.get_Item("key");
这样其实并不是太好,ruby要的方式是:
someValue = $indexerObject.key
这时候missing_method方法就可以来帮忙了:
def $indexer.method_missing(methodname);
$indexer.get_Item(methodname.to_s)
end
$indexer.get_Item(methodname.to_s)
end
一个例子:
class SimpleCallLogger
def initialize(o)
@obj = o
end
def method_missing(methodname, *args)
puts "called: #{methodname}(#{args})"
a = @obj.send(methodname, *args)
puts "\t-> returned: #{a}"
return a
end
end
def initialize(o)
@obj = o
end
def method_missing(methodname, *args)
puts "called: #{methodname}(#{args})"
a = @obj.send(methodname, *args)
puts "\t-> returned: #{a}"
return a
end
end
点到为止,有兴趣的朋友咱们email讨论: fanweixiao$$$$$gmail%%%%%%com
相关连接:
monkey patch
ruby的method_missing
monkey patching clr objects