通过各种 xxx_eval
动态生成类和方法
然后用接收的参数 Cls.send :XXmethod 调用
代码里只有接收参数,类和方法都是 transparent 代码看起来很简洁
有兴趣可以看一下 sicp,看完会对编程语言有新的理解。当然看了也可能白看,就像我虽然看过,但是现在也只是整天 crud,对工作并没有帮助。
个人觉得 ruby 达到了一种平衡。对传统的纯搭积木的 lisp 来说,多了自己本身的一套 oo 构建和一些 libs,相对于传统 oo 语言呢?又多了一些灵活性。可以称之为缝合怪,当然难听点也可以叫四不像。
class Base
['xx', 'oo'].each do | method|
define_method(method.to_sym) do |name,block|
yield block
end
end
end
class MyApp < Base
xx "abc" do
p "aa"
end
oo "123" do
p "11"
end
end
想 eval 一下 MyApp 中的 block,怎么取得 MyApp 中的 block?
var data_params=" a,b " ;
var data_body=" var c=a + b;alert(c); ";
var d=new Function(data_params, data_body);
d(100,200);
这算元编程吗?
class Base
class << self
['xx', 'oo'].each do | method|
define_method(method.to_sym) do |name, &block|
block.call(name)
end
end
end
end
yield 在这里取不到 block(可能是环境不在 def 方法下的原因?),同样这里的 block_given?也取不到正确的值,不过可以用&block 可以取到正确的 block
有没有人觉得 ruby 的元编程很象 c 里面的宏 基类定义一 堆复杂的方法 相当于 define 宏
#define DECLARE_DYNAMIC(class_name) \
public: \
static const CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
然后在子类中传参数
class CMyClass:public CObject {
DECLARE_DYNAMIC(CMyClass)
};
继承的时侯相当于宏展开 然后有子类 class 名称 有方法名,有接收的参数,然后用 send 就可以随便调用了 客户代码只接收必要的参数,其他成员变量就用 class_variable_set/instance_variable_set 动态添加 方法就用 class_eval/instance_eval/module_eval 动态添加