科技时代新浪首页 > 科技时代 > 学园 > 正文

Ruby程序快速入门之数字字符串和其它(2)


http://www.sina.com.cn 2006年04月24日 16:27 天极yesky

  布尔类型

  最后,让我们再看一下布尔类型。在Ruby中,有两个类用于表达布尔类型:TrueClass和FalseClass。每个这些类仅有一个实例(一个singleton):也就是true和false。这些是可在Ruby的任何地方存取的全局值。还有一个类NilClass。NilClass也仅有一个实例nil-表示什么也没有。然而,在布尔逻辑中,nil是false的同义词。

irb(main):001:0> true|false
=> true
irb(main):002:0> true&false
=> false
irb(main):003:0> true|nil
=> true
irb(main):004:0> true&nil
=> false

  正规表达式

  大多数程序语言中都使用正规表达式。基于许多脚本语言的Ruby也广泛地使用正规表达式。我的一个同事曾经说"正规表达式太复杂了。"换句话说,你需要花费一些时间来学习正规表达式。在本文中,你仅能一瞥Ruby正规表达式的威力。在程序开发中,你不必一定使用正规表达式,但是如果使用这种工具,你的编码将更为紧凑而容易。而且,如果你想成为一名Ruby大师,你必须要花费其它时间来研究它。
在下面的例子中,Ruby中的正规表达式是在Tiger或菲Phil之间定义的。

/Tiger|Phil/

  现在你可以在一个条件或循环语句中使用带有一个匹配操作符("=~")的正规表达式来匹配或查找其它的字符串。

irb(main):001:0>
golfer="Davis"
if golfer =~ /Tiger|Phil/
puts "This is going to be a long drive."
else
puts "And now a drive by " + golfer
end
=> "Davis"

  下面是另一个稍微复杂些的正规表达式:

/[\w._%-]+@[\w.-]+.[a-zA-Z]{2,4}/

  你能够猜出这个表达式代表什么意思吗?它相应于一个电子邮件地址。这个正规表达式可以用来校验电子邮件地址。

irb(main):001:0>
emailRE= /[\w._%-]+@[\w.-]+.[a-zA-Z]{2,4}/
email = "jwhite@interechtraining.com"
if email =~ emailRE
puts "This is a valid email address."
else
puts "this is not a valid email address."
end
这是一个有效的电子邮件地址。
irb(main):002:0>
email = "###@spammer&&&.333"
if email =~ emailRE
puts "This is a valid email address."
else
puts "this is not a valid email address."
end

  这不是一个有效的电子邮件地址。

  图2把电子邮件正规表达式分解开来。你已看到,正规表达式语言是相当丰富的,但在此不多详述。有关正规表达式的更多信息请参考http://www.regular-expressions.info

Ruby程序快速入门之数字字符串和其它(2)

图2.电子邮件正规表达式

  注意,在Ruby中正规表达式也是一种对象。在下面的代码示例中,一个正规表达式实例(派生自类Regexp)作为String方法的一个参数(gsub)以达到使用"glad"来替换和"happy"与"joy"之目的。

irb(main):001:0>
quote = "I am so happy. Happy, happy, joy, joy!"
regx = /(h|H)appy|joy/
quote.gsub(regx, "glad")
=> "I am so happy. Happy, happy, joy, joy!"
=> /(h|H)appy|joy/
=> "I am so glad. glad, glad, glad, glad!"

  当你在正规表达式对象上使用=~操作符时,你能够得到例如匹配模式串的索引等信息。

irb(main):001:0> /Tiger|Phil/=~"EyeOfTheTiger"
=> 8

  如果你曾编写过大量有关字符串的程序,你就会知道Ruby中的正规表达式是非常有力量的。因此,我建议在较深入地用Ruby开发你的第一个程序前,你应该全面地探讨一下Ruby中的正规表达式。当然,你可以参考本文相应的源码文件,其中包含了大量的正规表达式。

  范围

  在Ruby中,一个很不平常但是非常有用的概念就是范围(range)。一个范围是一个值序列。例如,字符a到z就可以定义在英语字母表中的所有的小写字母。另外一个范围的例子是整数1到10。一个范围能从任何类型的对象中创建,假定对象的类型允许使用Ruby的操作符(<=>)和succ方法进行比较。根据<=>操作符左边的操作数是否小于,等于或大于<=>操作符右边的操作数,<=>操作符将分别返回-1,0或+1。例如,"A"<=>"B"将返回-1。运行于整数4上的succ方法(4.succ)将返回5。

  可以使用Range类的new方法或特殊的标志来创建一个范围。下面是在irb中分别使用括号和点速记标志创建的两个相同的范围(表示所有的大写字母)。

irb(main):001:0> r1=Range.new("A","Z")
=> "A".."Z"
irb(main):002:0> r2=("A".."Z")
=> "A".."Z"

  当创建一个范围时,必须指定开始值和结束值。在上面的情况中,A作为开始值,Z作为结束值。当创建一个范围时,你还可以指示是否这个范围应该包括或不包括末尾元素。默认情况下,如上例所示,范围包括末尾元素。为了排除结束元素,你可以使用new方法的排除参数(置为true)或如下所示的3个点的速记标志。

irb(main):001:0> r1=Range.new("A","Z",true)
=> "A"..."Z"
irb(main):002:0> r2=("A"..."Z")
=> "A"..."Z"
irb(main):003:0> r1.include?"Z"
=> false
irb(main):004:0> r2.include?"Z"
=> false

  上面的示例中在范围上调用的include?方法显示是否其参数是范围的一个成员。上例中,"Z"不是范围的一个元素。这个方法还有一个与之等价的操作符"==="-它实现相同的功能。

irb(main):005:0> r2==="Z"
=&Gt;
false

  范围被应用在Ruby编程的许多方面。它们有两种特定的使用:作为生成器(generator)和谓词(predicate)。作为一个生成器,在范围上的每个方法允许你遍历该范围中的每个元素;例如,你想确定在一个K字节范围中的实际字节数。下面在irb中运行的代码使用了一个范围作为K字节到字节的生成器。

irb(main):008:0>
kilobytes=(1..10)
kilobytes.each{|x| puts x*1024}
=> 1..10
1024
2048
3072
4096
5120
6144
7168
8192
9216
10240

  在Ruby中,条件逻辑范围可以被用作谓语(predicate),通常借助于操作符===的帮助。例如,你可以使用一个范围谓词来测试一个相对于有效的端口号(0~65535)和保留的端口号(0~1024,不包括1024)的整数参考。

irb(main):001:0>
proposedPort = 8080
validPorts=(0..65535)
reservedPorts=(0...1024)
if (validPorts === proposedPort) & !(reservedPorts === proposedPort)
puts "Proposed port is ok to use."
else
puts "Proposed port is not allowed to be used."
end
=> 8080
=> 0..65535
=> 0...1024

  上例的结果是,建议的端口号可以使用。

  另外,范围也可以用于存取数据结构(如数组和哈希表)中的元素。

[上一页] [1] [2]

发表评论

爱问(iAsk.com) 相关网页共约19,800,000篇。



评论】【论坛】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭




科技时代意见反馈留言板 电话:010-82628888-5595   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2006 SINA Corporation, All Rights Reserved

新浪公司 版权所有