跨越边界: 活动记录和Java编程中特定于域的语言 - 编程入门网
; 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 扩展
Rails 利用这个能力处理像时间测量之类的事情。例如,在 Rails 应用程序中,可以说 10.days , 或 2.hours.ago,或 5.minutes.from_now。使用这个技术,可以把现有 Ruby 词汇扩展到自己的域中, 处理类似测量、转换或其他语法组合的事情。最终结果是一个干净漂亮的 Ruby 核心类,带有一些扩展, 提供特定于域的类,可以在域的上下文中做正确的事。 动态地构建类 在得到了词汇和扩展类的能力之后,下一步是根据词汇动态地 扩展类。在 清单 1 中的 attr 就是这 种技术的示例。现在将介绍如何实现它(感谢 Glenn Vanderburg;请参阅 参考资料)。清单 5 显示了 初步的尝试: 清单 5. 动态扩展类的初步尝试
这个示例稍微复杂了一些。self.class 返回 Person 的类。然后 class_eval 在这个类的上下文环境 下计算以下字符串。第一行定义 getter,第二行定义 setter。这个示例把 name 属性添加到 Person。 清单 5 有两个主要问题。首先,需要显式地调用 my_attr。还不能从类中调用它,因为它还没有定义 。其次,硬编码的 name 应当是个符号。第一个问题可以通过声明一个模块并从这个模块进行继承来解决 。第二个问题可以通过传递进一个符号来解决。清单 6 显示了第二次尝试: 清单 6. 动态地扩展类的第二次尝试
跨越边界: 活动记录和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. 定义定制属性
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |