CatCoding

Ruby vs C++ for delegation

2012-10-16

下班之前同事 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)

公号同步更新,欢迎关注👻