跨越边界: 活动记录和Java编程中特定于域的语言 - 编程入门网
: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 存取器
清单 2 —— Ruby 版的 getter 和 setter —— 看起来应当有点儿熟悉。name= 实际上是个方法名 称,而 @ 加在所有实例变量前作为前缀,但剩下的就与 Java 的 getter 和 setter 很类似了。 如果不用清单 2 中的代码,也可以用 @attr 的另一个版本来创建带有 getter、setter 或两者都有 的属性。 符号 第二个值得注意的概念是符号。可以把 :email 当成名为 email 的东西。Ruby 符号像字符串,但是 是不可修改的字符串,而且只有一个实例。只能使用一个 :email 符号。 现在看起来像下面这样的活动记录代码应当让您有点儿感觉了:
has_one 是个方法,:department 是个符号,活动记录只是把它解释成类的名称。因为 Ruby 并不强 制要求在方法参数两边使用括号,还因为 Rails 可以使用专门为活动记录设计的符号和方法名称,所以 这个词汇畅通无阻。 可选的扩展 活动记录充分利用了 Ruby 的另一个特性。会经常看到带有可选参数的 Ruby 方法,可选参数是一个 默认为空的哈希 map。可以用这种方式模拟命名参数。例如,活动记录方法 belongs_to 的定义看起来像 这样:
现在可以把选项传递给 belongs_to 来优化它的行为:
在 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. 罗马数字处理方法
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |