快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
:0> person.name = "Elvis" => "Elvis" irb(main):006:0>

在清单 1 中,创建了叫作 Person 的类,它有两个实例变量分别叫作 name 和 email。请特别注意 attr_accessor :name, :email 这一行。有两个概念应当引起注意:

类定义中的方法调用

符号的使用

方法调用

清单 1 中的 attr_accessor :name, :email 语句创建两个属性,分别带有 getter 和 setter 存取 器。attr 实际上是个方法调用 —— 是 Ruby 语言本身元编程的精彩示例。Java 开发人员习惯于在类体 中看到方法声明,而不习惯看到方法调用。这个方法调用把方法和实例变量添加到 Person 类中。

如果没有 attr_accessor :name, :email,就必须为每个需要的属性输入清单 2 的代码:

清单 2. Ruby 存取器

def name=(value) @name = value end def name return @name end

清单 2 —— Ruby 版的 getter 和 setter —— 看起来应当有点儿熟悉。name= 实际上是个方法名 称,而 @ 加在所有实例变量前作为前缀,但剩下的就与 Java 的 getter 和 setter 很类似了。

如果不用清单 2 中的代码,也可以用 @attr 的另一个版本来创建带有 getter、setter 或两者都有 的属性。

符号

第二个值得注意的概念是符号。可以把 :email 当成名为 email 的东西。Ruby 符号像字符串,但是 是不可修改的字符串,而且只有一个实例。只能使用一个 :email 符号。

现在看起来像下面这样的活动记录代码应当让您有点儿感觉了:

class Manager < ActiveRecord::Base has_one :department end

has_one 是个方法,:department 是个符号,活动记录只是把它解释成类的名称。因为 Ruby 并不强 制要求在方法参数两边使用括号,还因为 Rails 可以使用专门为活动记录设计的符号和方法名称,所以 这个词汇畅通无阻。

可选的扩展

活动记录充分利用了 Ruby 的另一个特性。会经常看到带有可选参数的 Ruby 方法,可选参数是一个 默认为空的哈希 map。可以用这种方式模拟命名参数。例如,活动记录方法 belongs_to 的定义看起来像 这样:

def belongs_to(association_id, options = {})

现在可以把选项传递给 belongs_to 来优化它的行为:

class Manager < ActiveRecord::Base has_one :department, :foreign_key => "department_number" end

在 Ruby 中,用 key => value 指定哈希 map 的条目。意思很清楚:想让活动记录覆盖默认值 (department_id,根据命名规范)而采用 department_number。因为可以修剪选项的名称来满足语法的 要求,所以 DSL 就得到了另一个强大的特性:可选的扩展。下面需要的能力是用自己的词汇来扩展 Ruby 语言。

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

时间:2011-07-25 IBM Bruce Tate

修饰现有类型

Ruby 是种动态语言,所以向现有类(甚至指定类的实例)添加行为很容易。现在先使用这项技术来针 对某个域修饰现有类,然后再根据词汇扩展现有类。

罗马数字的使用不太频繁,但是在某些上下文中会有用。我们并不想直接把罗马数字添加到 Ruby 的 Fixnum 基类,但是它们对于特定于域的语言可能是有用的。可以把 to_roman 方法添加到 Fixnum 类, 这个方法把 fixnum 转换成罗马数字。这件事做起来极为容易。只要再次打开类定义,并定义新方法即可 。清单 3 显示了一个粗糙的罗马数字处理方法:

清单 3. 罗马数字处理方法

class Fixnum def to_roman   value = self   str = ""   (str << "C"; value = value - 100) while (value >= 100)   (str << "XC"; value = value - 90) while (value >= 90)   (str << "L"

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号