中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Windows编程
没有Rails Java程序员如何使用Ruby(3)
作者:佚名 时间:2007-12-10 17:19 出处:天极 责编:月夜寒箫
              摘要:没有Rails Java程序员如何使用Ruby(3)

attr_reader和attr_writer都不是关键字,而实际上都是Ruby中的方法(可以在Module类中找到它们)-它们使用符号作参数。一个符号是以冒号(:)开头的任何变量,甚至在有些情况下,符号本身就是对象!

注意,因为我在列表3中使synonyms成为只读的,所以Ruby否定了我在列表7中最后一行代码的尝试。

另外,我可以使用attr_accessor方法编写属性声明代码以指出一个属性既可读也可写。

九、迭代

灵活的迭代是Ruby编程的快乐之一。请参考列表8,其中列出的是Word的initialize()方法的代码:

列表8.Closures非常方便

            

def initialize(spelling, part_of_speech, definitions = [], synonyms = [])
@spelling = spelling
@part_of_speech = part_of_speech
definitions.each{ |idef| idef.word = self}
@definitions = definitions
@synonyms = synonyms
end 

列表8中的第四行代码中出现了一些不同的东西。对于入门者来说,当我调用definitions实例上的每个方法时,我使用了大括号。每个方法实质上类似Java语言中的一个Iterator,但是它更简单。在列表8中,由每个方法处理迭代细节而只需调用者专注于期望的效果。在此例中,我传递了一个块,其意思是“for each value in the collection”,也就是idef,它是Definition的一个实例。

列表9实质上展示了用Java语言实现的同一行代码(来自于Word的构造器中,见列表1):

列表9.前面Ruby的每个方法都类似Java的迭代算子

            

for(Iterator iter = definitions.iterator(); iter.hasNext();){
this.validateRelationship((Definition)iter.next());
}

现在,我要承认Java 5的针对于for循环语法的泛型和new比列表9中要简洁得多。Ruby支持我们熟悉的Java中的循环结构,如for和while;实际上,在Ruby中,它们是很少使用的,因为在Ruby中的大多数东西都支持迭代的概念。例如,在列表10中,你会看到实现对于一个文件内容的迭代是多么容易:

列表10.迭代变得非常简单

            

count = 0
File.open("./src/dictionary.rb").each { |loc| puts "#{count += 1}:" + loc }

Ruby中的支持each方法的任何类(如File)都可以让你用这样方式进行迭代。顺便说一下,Ruby的puts方法(见列表10)与Java语言中的System.out.println一样。

十、条件语句

现在,让我们仔细地分析一下在列表3中的Word类中的一个条件语句。在列表11中,我列出了add_definition()方法的代码:

列表11.巧妙的条件表达

            

def add_definition(definition)
definition.word = self if definition.word != self
@definitions << definition
end

请仔细观察在第二行中的代码,看一下if语句是怎样跟随表达式的。你当然可以以正常方式书写它(由列表12所示),但是是否列表11更好些?

列表12.使用多种方式来表达一个条件

            

def add_definition(definition)
if definition.word != self
definition.word = self
end
@definitions << definition
end

在Java语言中,如果条件语句体只占一行,那么你可以删除大括号。在Ruby中,如果条件语句体只占一行,那么你可以编写象列表11所示的表达式。还要注意,同一样的条件也可以表达为"definition.word = self unless definition.word == self",在此使用了Ruby的"unless"特征。效果如何?

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有