Ruby 元编程是用 eval 实现的吗?

tablecell · 2021年09月24日 · 最后由 Jim 回复于 2021年10月04日 · 971 次阅读

通过各种 xxx_eval 动态生成类和方法 然后用接收的参数 Cls.send :XXmethod 调用

代码里只有接收参数,类和方法都是 transparent 代码看起来很简洁

元编程是利用元数据编程,编程语言元数据是描述语言自身的,通过增加、修改、删除元数据达到对语言能力的拓展。

LiinNs 回复

瞬间高大上的赶脚

有兴趣可以看一下 sicp,看完会对编程语言有新的理解。当然看了也可能白看,就像我虽然看过,但是现在也只是整天 crud,对工作并没有帮助。

个人觉得 ruby 达到了一种平衡。对传统的纯搭积木的 lisp 来说,多了自己本身的一套 oo 构建和一些 libs,相对于传统 oo 语言呢?又多了一些灵活性。可以称之为缝合怪,当然难听点也可以叫四不像。

干点正事吧。别没事总想着黑魔法。

pynix 回复
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?

tablecell 回复

搜索到一篇文章,希望有启发 https://www.dazhuanlan.com/klesh/topics/1479337

能够实现一个解释器,并且能够把代码当作数据就可以元编程。

rubyKC 回复
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);

这算元编程吗?

tablecell 回复
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

illusove 回复

类里面既不是 attributes 又不是 initialize/method 中间的这段代码的正式术语叫什么?

有没有人觉得 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 动态添加

ruby 元编程怪里怪气的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号