快速业务通道

跨越边界: 活动记录和Java编程中特定于域的语言 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
; value = value - 50) while (value >= 50)   (str << "XL"; value = value - 40) while (value >= 40)   (str << "X"; value = value - 10) while (value >= 10)   (str << "IX"; value = value - 9) while (value >= 9)   (str << "V"; value = value - 5) while (value >= 5)   (str << "IV"; value = value - 4) while (value >= 4)   (str << "I"; value = value - 1) while (value >= 1)   str end end

一旦理解了分号分隔了两个不同的 Ruby 语句,清单 3 就简单了。当我想让两个不同的想法挂在一起 的时候,就经常用这种方式。可以用这项技术添加或修改任何 Ruby 类的定义。这一特殊实现的好处在于 使用模型。可以把它粘贴到一个文件中,并在 Ruby 解释器中使用它,如清单 4 所示:

清单 4. 使用 to_roman 扩展

irb(main):001:0> load ''to_roman.rb'' => true irb(main):002:0> 10.to_roman => "X" irb(main):003:0> 199.to_roman => "CXCIX" irb(main):004:0>

Rails 利用这个能力处理像时间测量之类的事情。例如,在 Rails 应用程序中,可以说 10.days , 或 2.hours.ago,或 5.minutes.from_now。使用这个技术,可以把现有 Ruby 词汇扩展到自己的域中, 处理类似测量、转换或其他语法组合的事情。最终结果是一个干净漂亮的 Ruby 核心类,带有一些扩展, 提供特定于域的类,可以在域的上下文中做正确的事。

动态地构建类

在得到了词汇和扩展类的能力之后,下一步是根据词汇动态地 扩展类。在 清单 1 中的 attr 就是这 种技术的示例。现在将介绍如何实现它(感谢 Glenn Vanderburg;请参阅 参考资料)。清单 5 显示了 初步的尝试:

清单 5. 动态扩展类的初步尝试

class Person def my_attr   self.class.class_eval "def name; @name; end"   self.class.class_eval "def name=(val); @name = val; end" end end

这个示例稍微复杂了一些。self.class 返回 Person 的类。然后 class_eval 在这个类的上下文环境 下计算以下字符串。第一行定义 getter,第二行定义 setter。这个示例把 name 属性添加到 Person。

清单 5 有两个主要问题。首先,需要显式地调用 my_attr。还不能从类中调用它,因为它还没有定义 。其次,硬编码的 name 应当是个符号。第一个问题可以通过声明一个模块并从这个模块进行继承来解决 。第二个问题可以通过传递进一个符号来解决。清单 6 显示了第二次尝试:

清单 6. 动态地扩展类的第二次尝试

class Module def my_attr(symbol)   class_eval "def #{symbol}; @#{symbol}; end"   class_eval "def #{symbol}=(value); @#{symbol} = value; end" end end

跨越边界: 活动记录和Java编程中特定于域的语言(4)

时间:2011-07-25 IBM Bruce Tate

清单 6 看起来有点儿神秘,但是不用担心。可以在一点儿帮助下理解这段代码。刚才只改变了三件事 :

没有声明新的 Person 类,而是打开了超类 —— Ruby 的 Class。

没有硬编码 name,而是传递进一个叫作 symbol 的参数。用 #{symbol} 代替了 name。Ruby 用代表 符号的字符串替换 #{symbol}。

用 class_eval 代替了 self.class.class_eval。代码已经在类中操作了,所以不需要得到 self.class。

要查看它的工作,可以在 Ruby 解释器中输入清单 7 中黑体部分的代码:

清单 7. 定义定制属性

irb(main):001:0> require "my_attr.rb" => true irb(main):002:0> class Person irb(main):003:1>

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号