首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

[转帖]在Ruby中对字符串跟block求解

2012-10-26 
[转帖]在Ruby中对字符串和block求解在Ruby中对字符串和block求解作者:Jay Fields 原文:http://tech.it168.

[转帖]在Ruby中对字符串和block求解

在Ruby中对字符串和block求解
作者:Jay Fields 原文:http://tech.it168.com/d/2007-09-07/200709071737579.shtml

介绍
    对包含代码的字符串和block求解,是我最钟爱的Ruby特性之一。Ruby提供了多种不同类型的求解方式;不过我最常用的是下面这些:eval、instance_eval和class_eval。

Module.class_eval
    使用Module类的class_eval(及其别名module_eval)方法,可以在一个类的定义或者module定义的上下文中对给定字符串或block进行求解。我们常常用class_eval来向类的定义中加入方法,或是包含其他的module。



与使用class_eval的示例类似,实例变量的值可以通过其他的方式获取,不过使用instance_eval是一种非常直观的做法。

Kernel.eval
    使用Kernel的eval方法可以在当前上下文中对一个字符串求解。可以选择为eval方法制定一个binding对象。如果给定了一个binding对象,求解的过程会在binding对象的上下文中执行。


    记得当时我觉得这样调用eval是非常丑陋的做法,但那会儿我想不出更好的方式来实现这样的效果;因此我把代码贴到了博客中,等待别人的指摘;他们很快就做出了回应,并给出下面的做法。一开始我并没有觉察这样做的好处,但是后来我意识到这个解法是非常出色的:它只需要调用一次eval方法,而不是在每次进行方法定义时都去重新调用eval。


使用上面的代码,调用SqlGenerator.evaluate方法并给定一个block参数,便可以生成一条SQL语句:


执行结果:


ContextOne继承自DslContext。DslContext的定义如下。



ContextOne的method_missing方法中使用了List类,List类代码如下。


我们把eval所在的语句拆开看看它都干了什么。它做的第一件事情是:
查看更多 下一篇
热点排行