下班之前同事 BigBird 给我 show 他的一段 C++ 代码,对于我等拿 C++ 当作 C 来用的未入门者实看起来实在是炫丽。虽然比较冗长晦涩,不过还是能看懂个大概,然后觉得这对于动态语言是非常容易实现的。于是晚上回来用 Ruby 来搞搞,弄出下面这么段代码。
C++ 版本在这里https://gist.github.com/3900077。
可见动态语言和编译型语言实现起来效率还是好太多了,同时代码也好理解。
再次我讨厌 C++ 类型推导,^_^。
Ruby 实现这个方式很多,另外 Ruby 的库包含 SimpleDelegator 的,将调用的方法直接传递到其他对象。
#!/usr/bin/ruby
class Delegate
attr_reader :proc_list
def initialize()
@proc_list = []
end
def add(*proc)
proc_list.push(proc)
end
def eval(obj)
for e in proc_list:
if obj.respond_to?(e[0])
if e.size == 1
obj.__send__(e[0])
else
obj.__send__(e[0], e[1])
end
else
printf "ERROR:%s is not defined\n", e[0]
end
end
end
end
class Demo
attr_writer :value
public
def print()
printf "value:%d\n", @value
end
def hello()
printf "Hello world!\n"
end
def set(val)
@value = val
end
end
delegate = Delegate.new()
delegate.add("print")
delegate.add("set", 1)
delegate.add("print")
delegate.add("hello")
delegate.add("nodefine")
d = Demo.new()
delegate.eval(d)