扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共5页)
有时,想根据外部情况把方法添加到类。例如,假设想在 Ruby 中表示罗马数字。要把它们与字符串分开,可以用 Roman.III
的形式把数字 3 表示成罗马数字。要为每个可能的罗马数字都向 Roman
添加类方法,是不现实的,而且使用 Ruby 时也不需要这么做。可以利用一个小技巧。
在 Ruby 中,在遗漏了一个方法时,Ruby 就会调用 method_missing
方法。可以覆盖它来提供罗马数字,如清单 8 所示:
|
这个代码相当简单,但是确实使用了 Java 程序员不熟悉的一些 Ruby 特性。由于覆盖了 method_missing
,所以只要这个类的客户调用一个不存在的方法,Ruby 就会调用这个方法。下面说明细节:
name
代表方法名 *args
代表遗漏方法的参数 to_s
把它转换成 String
。X
、V
和 I
的出现,还不能得到它们的值。I
(1)、V
(5)、X
(10)、 L
(50)或 C
(100)。对于 DSL,这个技术极为强大。活动记录使用这个功能实现动态查找器。活动记录没有为每个列实际地添加查找器,而是使用了 method_missing
。使用这个策略,活动记录不仅能匹配一个列,还能匹配列的组合。例如,把 name
和 email
列添加到 people
表,可以支持 Person
类的 People.find_by_name_and_email
查找器。像这样的细节使得活动记录的用户体验非常舒服。它们也让活动记录的实现非常简洁而有意义,所以在活动记录做的工作不符合自己的要求时,随时可以实现自己的补丁。
在使用 Java 语言时,选项就非常有限了。元编程更困难,所以很少能够得到活动记录那样的体验。但是如果真的急需 DSL,还是有些选项的。而且不用总是求助于 XML 或标注。下面是一些常用的方法:
这些主意,每个都有一系列 developerWorks 文章,所以我在这里对它们就不做太多详细介绍了,但是有一点我要提一下。如果需要在 Java 语言中使用 DSL,需要问自己四个问题:
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者