Ruby程序语言之数字、字符串和其它(1)
2007-09-21 13:27
323 查看
在Ruby中,一切都是对象。更精确地说,Ruby中的一切都是一个具有完整功能的对象。因此,在Ruby中,数字4,定点数3.14和字符串"Hi"都是对象。显然,它们是有点"特殊"的,因为你不必使用new方法来创建它们。代之的是,你使用例如"literal 4"这样的形式来创建一个代表数字4的对象的实例。
然而,对于绝大多数人来说,学习一种新的编程语言时,首先理解该语言提供的"标准"类型是非常有用的。所以,在这一节,我们先探讨数字类型,字符串类型,布尔类型和另外一些基本的Ruby数据类型。
数字类型
实质上,Ruby中的数字被分为整数和浮点数两大类。其中,整数又被进一步细分为"常规大小"的整数和大型整数。因为在Ruby中一切都是对象,所以整数和浮点数都是按类来定义的(见图1)。从图1看出,Numeric是所有数字类型的基类,Float和Integer类是Numeric的子类。Fixnum和Bignum都是Integer的子类型-它们分别定义了"常规大小"的整数和大型整数。
![](http://www.qqread.com/ArtImage/20060612/kb40_1.jpg)
图1.Ruby的数字类型类继承图
Literal用来描述这些类的实例。下面的在交互式Ruby外壳(irb)中的代码显示了Float,Fixnum和Bignum的literal实例。注意,可以在literal上进行方法调用(在此,是指类方法)。
还有另外一些语法用来创建数字类型,显示于下面的代码列表中。字母E可以用来描述以指数标志的数字。数字的前面加上0代表这是一个八进制数,加上0x代表这是一个十六进制数,而0b代表是一个二进制数。为清晰起见,下划线可以用作数字中的分隔符号。注意,当写literal时,不要用逗号作为分隔符号。在一些情况中,这实际上能生成一个数组,我们将在后面讨论。最后,在一个字符(或Ctrl或元字符的组合)前面的一个问号将会创建一个Fixnum的实例,相应于字符的ASCII字符/逃逸序列值。
Fixnum和Bignum实例间的真实差别是什么?Fixnum整数可以被存储在机器中的一个字(通常16,32或64位)中,但减去1个位;而Bignum实例是超出固定存储空间的整数。当然,作为开发者,你不必担心整数的大小(见下面的例子),由Ruby负责为你实现Fixnum和Bignum之间的自动转换!
字符串
在Ruby中,字符串是任意顺序的字节。通常,它们是一个字符序列。在Ruby中,可以使用一个literal或new方法来创建String类的实例。
当然,String中定义了许多方法(和操作符)。另外,可以使用单引号或双引号来指定一个字符串。双引号情况下允许串中加入逃逸字符并能够嵌入待计算的表达式。在单引号串情况下,你看到的就是串中的实际内容。为了更好的理解,请看下列例子。
请注意,在显示之前,双引号中的文本是如何被计算的,其中包括了逃逸符号(/n)和表达式(#{2+2})。
除了使用单引号和双引号来定义一个字符串literal外,在Ruby中,还有另外的方法可以表达literal。一个百分号和小写或大写字母Q可以用来表达一个字符串,分别相应于单引号或双引号风格。
注意,跟随在q%或Q%后面的字符分别定义了字符串literal的开始和结束。在本例中,@符号用作字符串开始与结束的限界符号。
还应该注意,Ruby并没有区分一个字符串和一个字符。也就是说,没有适用于单个字符的特定的类-它们仅是一些小的字符串。
布尔类型
最后,让我们再看一下布尔类型。在Ruby中,有两个类用于表达布尔类型:TrueClass和FalseClass。每个这些类仅有一个实例(一个singleton):也就是true和false。这些是可在Ruby的任何地方存取的全局值。还有一个类NilClass。NilClass也仅有一个实例nil-表示什么也没有。然而,在布尔逻辑中,nil是false的同义词。
·Visual C++.NET中的字符串转换方法
正规表达式
大多数程序语言中都使用正规表达式。基于许多脚本语言的Ruby也广泛地使用正规表达式。我的一个同事曾经说"正规表达式太复杂了。"换句话说,你需要花费一些时间来学习正规表达式。在本文中,你仅能一瞥Ruby正规表达式的威力。在程序开发中,你不必一定使用正规表达式,但是如果使用这种工具,你的编码将更为紧凑而容易。而且,如果你想成为一名Ruby大师,你必须要花费其它时间来研究它。
在下面的例子中,Ruby中的正规表达式是在Tiger或菲Phil之间定义的。
现在你可以在一个条件或循环语句中使用带有一个匹配操作符("=~")的正规表达式来匹配或查找其它的字符串。
下面是另一个稍微复杂些的正规表达式:
你能够猜出这个表达式代表什么意思吗?它相应于一个电子邮件地址。这个正规表达式可以用来校验电子邮件地址。
这不是一个有效的电子邮件地址。
图2把电子邮件正规表达式分解开来。你已看到,正规表达式语言是相当丰富的,但在此不多详述。有关正规表达式的更多信息请参考http://www.regular-expressions.info。
![](http://www.qqread.com/ArtImage/20060612/kb40_2.jpg)
图2.电子邮件正规表达式
注意,在Ruby中正规表达式也是一种对象。在下面的代码示例中,一个正规表达式实例(派生自类Regexp)作为String方法的一个参数(gsub)以达到使用"glad"来替换和"happy"与"joy"之目的。
当你在正规表达式对象上使用=~操作符时,你能够得到例如匹配模式串的索引等信息。
如果你曾编写过大量有关字符串的程序,你就会知道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中分别使用括号和点速记标志创建的两个相同的范围(表示所有的大写字母)。
当创建一个范围时,必须指定开始值和结束值。在上面的情况中,A作为开始值,Z作为结束值。当创建一个范围时,你还可以指示是否这个范围应该包括或不包括末尾元素。默认情况下,如上例所示,范围包括末尾元素。为了排除结束元素,你可以使用new方法的排除参数(置为true)或如下所示的3个点的速记标志。
上面的示例中在范围上调用的include?方法显示是否其参数是范围的一个成员。上例中,"Z"不是范围的一个元素。这个方法还有一个与之等价的操作符"==="-它实现相同的功能。
范围被应用在Ruby编程的许多方面。它们有两种特定的使用:作为生成器(generator)和谓词(predicate)。作为一个生成器,在范围上的每个方法允许你遍历该范围中的每个元素;例如,你想确定在一个K字节范围中的实际字节数。下面在irb中运行的代码使用了一个范围作为K字节到字节的生成器。
在Ruby中,条件逻辑范围可以被用作谓语(predicate),通常借助于操作符===的帮助。例如,你可以使用一个范围谓词来测试一个相对于有效的端口号(0~65535)和保留的端口号(0~1024,不包括1024)的整数参考。
上例的结果是,建议的端口号可以使用。
另外,范围也可以用于存取数据结构(如数组和哈希表)中的元素。
然而,对于绝大多数人来说,学习一种新的编程语言时,首先理解该语言提供的"标准"类型是非常有用的。所以,在这一节,我们先探讨数字类型,字符串类型,布尔类型和另外一些基本的Ruby数据类型。
数字类型
实质上,Ruby中的数字被分为整数和浮点数两大类。其中,整数又被进一步细分为"常规大小"的整数和大型整数。因为在Ruby中一切都是对象,所以整数和浮点数都是按类来定义的(见图1)。从图1看出,Numeric是所有数字类型的基类,Float和Integer类是Numeric的子类。Fixnum和Bignum都是Integer的子类型-它们分别定义了"常规大小"的整数和大型整数。
![](http://www.qqread.com/ArtImage/20060612/kb40_1.jpg)
图1.Ruby的数字类型类继承图
Literal用来描述这些类的实例。下面的在交互式Ruby外壳(irb)中的代码显示了Float,Fixnum和Bignum的literal实例。注意,可以在literal上进行方法调用(在此,是指类方法)。
irb(main):001:0>3.class =>Fixnum irb(main):002:0>3.4.class =>Float irb(main):003:0>10000000000000000000.class =>Bignum |
< irb(main):001:0>3.14E5#指数标志 =>314000.0 irb(main):002:0>054#八进制 =>44 irb(main):003:0>0x5A#十六进制 =>90 irb(main):004:0>0b1011#二进制 =>11 irb(main):005:0>10_000#10,000,用下划线隔开 =>10000 irb(main):006:0>i=10,000#创建一个数组而不是10000Fixnum =>[10,0] irb(main):007:0>i.class =>Array irb(main):008:0>?Z#FixnumASCII值 =>90 irb(main):009:0>?Z.class =>Fixnum irb(main):010:0>?/C-s#Control-s的值ASCII =>19 |
irb(main):001:0>i=4 =>4 irb(main):002:0>i.class =>Fixnum irb(main):003:0>i=i+100000000000000 =>100000000000004 irb(main):004:0>i.class =>Bignum irb(main):005:0>i=i-100000000000000 =>4 irb(main):006:0>i.class =>Fixnum |
在Ruby中,字符串是任意顺序的字节。通常,它们是一个字符序列。在Ruby中,可以使用一个literal或new方法来创建String类的实例。
irb(main):001:0>s1="HelloWorld" =>"HelloWorld" irb(main):002:0>s2=String.new("HelloWorld") =>"HelloWorld" |
irb(main):001:0>str1='a/nstring' =>"a//nstring" irb(main):002:0>str2="a/nstring" =>"a/nstring" irb(main):003:0>putsstr1 a/nstring =>nil irb(main):004:0>putsstr2 a string =>nil irb(main):005:0>'trytoadd#{2+2}' =>"trytoadd/#{2+2}" irb(main):006:0>"trytoadd#{2+2}" =>"trytoadd4" irb(main):007:0>this="that" =>"that" irb(main):008:0>'whensinglequoterights#{this}' =>"whensinglequoterights/#{this}" irb(main):009:0>"doublequoterights#{this}" =>"doublequoterightsthat" |
除了使用单引号和双引号来定义一个字符串literal外,在Ruby中,还有另外的方法可以表达literal。一个百分号和小写或大写字母Q可以用来表达一个字符串,分别相应于单引号或双引号风格。
irb(main):001:0>%q@thisisasinglequotestring#{2+2}here@ =>"thisisasinglequotestring/#{2+2}here" irb(main):002:0>%Q@thisisadoublequotestring#{2+2}here@ =>"thisisadoublequotestring4here" |
还应该注意,Ruby并没有区分一个字符串和一个字符。也就是说,没有适用于单个字符的特定的类-它们仅是一些小的字符串。
布尔类型
最后,让我们再看一下布尔类型。在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" ifgolfer=~/Tiger|Phil/ puts"Thisisgoingtobealongdrive." else puts"Andnowadriveby"+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" ifemail=~emailRE puts"Thisisavalidemailaddress." else puts"thisisnotavalidemailaddress." end 这是一个有效的电子邮件地址。 irb(main):002:0> email="###@spammer&&&.333" ifemail=~emailRE puts"Thisisavalidemailaddress." else puts"thisisnotavalidemailaddress." end |
图2把电子邮件正规表达式分解开来。你已看到,正规表达式语言是相当丰富的,但在此不多详述。有关正规表达式的更多信息请参考http://www.regular-expressions.info。
![](http://www.qqread.com/ArtImage/20060612/kb40_2.jpg)
图2.电子邮件正规表达式
注意,在Ruby中正规表达式也是一种对象。在下面的代码示例中,一个正规表达式实例(派生自类Regexp)作为String方法的一个参数(gsub)以达到使用"glad"来替换和"happy"与"joy"之目的。
irb(main):001:0> quote="Iamsohappy.Happy,happy,joy,joy!" regx=/(h|H)appy|joy/ quote.gsub(regx,"glad") =>"Iamsohappy.Happy,happy,joy,joy!" =>/(h|H)appy|joy/ =>"Iamsoglad.glad,glad,glad,glad!" |
irb(main):001:0>/Tiger|Phil/=~"EyeOfTheTiger" =>8 |
范围
在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" |
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 |
irb(main):005:0>r2==="Z" =≫ false |
irb(main):008:0> kilobytes=(1..10) kilobytes.each{|x|putsx*1024} =>1..10 1024 2048 3072 4096 5120 6144 7168 8192 9216 10240 |
irb(main):001:0> proposedPort=8080 validPorts=(0..65535) reservedPorts=(0...1024) if(validPorts===proposedPort)&!(reservedPorts===proposedPort) puts"Proposedportisoktouse." else puts"Proposedportisnotallowedtobeused." end =>8080 =>0..65535 =>0...1024 |
另外,范围也可以用于存取数据结构(如数组和哈希表)中的元素。
相关文章推荐
- 笔试题——编写java程序:输入一个字符串,判断有几个英文字母,有几个数字,有几个其它的字符
- 通过程序统计字符串的大写字母个数、小写字母个数、数字个数和其它字符个数。用函数func实现功能
- 汇编语言: 从键盘上输入一串字符(用回车键结束,使用 10 号功能调用。)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字。如有,则把 CL 的第 5 位置 1,否则将该位置置 0。
- 华为2写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
- 字符串转数字,数字转字符串程序
- 编写一个程序统计各个数字、空白符(包括空格符、制表符及换行符)以及其它字符出现的次数
- 程序语言中的变量名为什么不能以数字开头
- c++实验5--统计输出字符串中(大/小写)字母个数,数字个数及其它字符个数。
- Ruby程序语言入门
- c语言 实现字符串和数字的连接
- 编写程序,当程序运行后,根据屏幕提示输入一个数字字符串,输入后统计有多少个偶数数字和奇数数字。
- 编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息。
- 经典c程序(0013)---输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
- JAVA语言中数字、字符和字符串处理
- 【微信小程序】字符串转数字
- 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
- ruby-数字、字符串、数组
- 编写一个程序统计输入字符串中: 各个数字、空白字符、以及其他所有字符出现的次数
- 华为机试: 计算字符串的相似度、输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- 统计一个输入字符串的(大小写数字其它)的字符个数