- 浏览: 1381932 次
- 性别:
- 来自: 陕西.西安
文章分类
最新评论
-
dare_:
经过试验 设置之后反而更慢没有调用ensureCapacity ...
ensureCapacity()方法提高ArrayList的初始化速度 -
wangchao9053:
[flash=200,200][url][img][list] ...
Only the original thread that created a view hierarchy can touch its views的相关 -
cyb504:
考虑将rb文件代码隐藏:我先使用命令jrubyc将所有rb文件 ...
Ruby学习十 JRuby中调用java代码 -
4562xse3460:
大哥,您这个写反了,差点误导我,我觉得看着就不对。百度第一条就 ...
portrait表示纵向,landscape表示横向 -
yin138:
portrait是肖像画,即竖屏,landscape是风景画, ...
portrait表示纵向,landscape表示横向
http://my4java.itpub.net/post/9983/57952
第二章 简单数据
本章包括:
1. Strings
2. Regular Expressions
3. Numbers
4. Times and Dates
5. Summary
理论指导实践,就像磁石吸引铁。
Karl Friedrich Gauss
对程序语言混合的度量是:它支持什么种类的数据?早期计算机是用纯粹数据数据的严格程序。不久,字符数据和字符的字符串被引入,这对于多用途语言的发展至关重。
随着时间推移,我们发现自己要处理越来越多的数据。现代语言通常包括对很多种类数据的支持。注意我们在这儿并没有说类型,是因为通常认为类型与数据有点不同。例如,正则表达式本质上通常存储字符形式的字符串,但我们并不认为它们是真正的字符串,因为它们还有别用途。
我们可以很容易地添加像数组和哈希表这样东西给列表,因为对Ruby来说它们是低级的实体。事实上,它们些附带用途。但数组和哈希表(更复杂的数据结构)应该单独有一章。
然后本章讨论Ruby中最常用的四种数据类型。它们是字符串,正则表达式,数字和时间与日期。
像其它语言中一样,字符串一些字符序列。与Ruby内的其它实体一样,字符串是第一类对象。
正则表达式是在文本内描述模型的浓缩符号。它使用的时间有10年了。
Numbers 需要一点解释,它们由整数和浮点数组成。在Ruby中,整数可以是类Fixnum或Bignum,这依赖于它们量级。
在许多语言中,时间和日期都有问题。Ruby以面向对象的接口来处理传统的时间与日期问题,以期望减少这些混乱。
提醒一下读者我们的讨论中没有包括Rang类。这是因为范围不是很有用的,也因为它们不复杂,但是本书代码会经常用到它。
现在让我们看看一些例子代码,我们从符串开始。
一旦原子成为基本的自然的构建块;然后质子成为基本材料,然后是夸子。现在我们说字符串是基本材料。
普林斯顿大学物理学教授David Gross,在1980年,计算机科学大会用简单问题开始了它的数据结构类。他没介绍自己和课程的名字;他没有课程提纲或教课书。他走进教室说,"最重要的数据类型什么?"
有一个或二个猜想。一些人认为,"指针",他说不,不是它。然后说出它观点:最重要的数据类型是字符数据。
他的观点正确。计算机被认为我们仆人,不是我们的主人,字符数据有人类可阅读上差别。(有些人可以很容易地读二进制数据,但我们忽略它们。)字符(然后是字符串)存在于人和计算机之间。包括我们可以想像到的每种信息,自然语言文字,都可以被编码为字符的字符串。
我们找到我自己能用字符串做什么呢?我们想连接它们,记号化它们,分析它们,完成搜索和替换,等等。Ruby可轻易地完成大多数任务。
Ruby内置了比较字符串思想;比较按我们希望的字典次序完成(也就是说,基于字符集次序)。但如果我们需要,我们可以引入我们自己的字符串比较规则,这些可以任意地复杂。
做为一个例子,假设我们想忽略英语句子中字符串以a,an,和the开头的字符。我们也想忽略大多数常用的标点符号。我们可以通过覆写内置方法<=>来做到,该方法通常由<,<=,>和>=调用(参见Listing2.1)。
Listing 2.1 Specialized String Comparisons
class String
alias old_compare <=>
def <=>(other)
a = self.dup
b = other.dup
# Remove punctuation
a.gsub!(/[,.?!:;]/, "")
b.gsub!(/[,.?!:;]/, "")
# Remove initial articles
a.gsub!(/^(a |an |the )/i, "")
b.gsub!(/^(a |an |the )/i, "")
# Remove leading/trailing whitespace
a.strip!
b.strip!
# Use the old <=>
a.old_compare(b)
end
title1 = "Calling All Cars"
title2 = "The Call of the Wild"
# Ordinarily this would print "yes"
if title1 < title2
puts "yes"
else
puts "no" # But now it prints "no"
注意我们用个别名来保存旧版本的<=>并在最后调用它。这是因为如果我们想使用<方法,而它调用新的<=>而不旧的哪个,结果是无穷递归,程序当掉。
也要注意==操作符不调用<=>方法(从Comparable中混插)。这意味着如果我们需要以一些特定方式检查等同性,我们将必须个别地覆写==方法。但这个例子中,==像我们希望的一样,它能工作。
split方法将解析字符串并返回记号的数组。它接受两个参数,一个界定符,和一个字段限制,它是一个整数。
界定符缺省是空格。实际上,它使用$;或者等价的$FIELD_SEPARATOR。如果界定符是字符串,那么字符地串使用它做为记号分割器。
s1 = "It was a dark and stormy night."
words = s1.split # ["It", "was", "a", "dark", "and",
# "stormy", "night"]
s2 = "apples, pears, and peaches"
list = s2.split(", ") # ["apples", "pears", "and peaches"]
s3 = "lions and tigers and bears"
zoo = s3.split(/ and /) # ["lions", "tigers", "bears"]
1. 如果被省略或是0:删除数组尾部的空字符串。
2. 如果是正整数,limit > 0: 为数组分配至多limit个元素。 (填充余下的字符串到最后字段)。
3. limit < 0: 相当于指定limit的值为正无穷。对字段的数量没有限制。
这儿是对三个规则的演示:
str = "alpha,beta,gamma,,"
list1 = str.split(",") # ["alpha","beta","gamma"]
list2 = str.split(",",2) # ["alpha", "beta,gamma,,"]
list3 = str.split(",",4) # ["alpha", "beta", "gamma", ","]
list4 = str.split(",",8) # ["alpha", "beta", "gamma", "", ""]
list5 = str.split(",",-1) # ["alpha", "beta", "gamma", "", ""]
3、格式化字符串
Ruby内的字符串格式化像C语言一样,由sprintf方法完成。它接受一个字符串和一个表达式列表做为参数并返回一个字符串。本质上格式化符串包含一套指示符,它们与C中的是一样的。
name = "Bob"
age = 28
str = sprintf("Hi, %s... I see you're %d years old.", name, age)
你可以会问我们为什么使用它而不用简单的#{ expr }来插入值。回答是sprintf方法可以做些额外的格式化工作,如指定最大宽度,指定十进制小数点的位置,添加或抑制前导零,左侧对齐,右对齐等等。
str = sprintf("%-20s %3d", name, age)
String类有个方法%,它将做同样的事情。它接受一个值或任意类型的值的数组。
str = "%-20s %3d" % [name, age] # Same as previous example
我们也方法ljust, rjust, 和 center;它们接受目的字符串和用来填充的空白。
str = "Moby-Dick"
s1 = str.ljust(13) # "Moby-Dick "
s2 = str.center(13) # " Moby-Dick "
s3 = str.rjust(13) # " Moby-Dick"
Ruby的String类提供了丰富的方法来控制大小写。我们这儿是的楖要。
downcase方法将转换字符串为小写。同样upcase方法将字符串转换为大写。
s1 = "Boston Tea Party"
s2 = s1.downcase # "boston tea party"
s3 = s2.upcase # "BOSTON TEA PARTY"
capitalize方法将字符串第一个字符变为大写,并强制其它字符为小写。
s4 = s1.capitalize # "Boston tea party"
s5 = s2.capitalize # "Boston tea party"
s6 = s3.capitalize # "Boston tea party"
s7 = "THIS IS AN ex-parrot."
s8 = s7.swapcase # "this is an EX-PARROT."
每个方法都有用于替换的等价方法 (upcase!, downcase!, capitalize!, swapcase!).
没有用于侦测大小写情况的内置方法,但是很容易用正则表达式来做一个。
if string =~ /[a-z]/
puts "string contains lowercase charcters"
end
if string =~ /[A-Z]/
puts "string contains uppercase charcters"
end
if string =~ /[A-Z]/ and string =~ /a-z/
puts "string contains mixed case"
end
if string[0..0] =~ /[A-Z]/
puts "string starts with a capital letter"
end
在Ruby中,可以有几种不的方式访问子串。通常使用方括号,就像数组一样;但方括号可以包含一对Fixnums数值,一个Range对象,正则表达式,或一个字符串。依次讨论每种情况。
如果指定一对Fixnum数值,它们被视为偏移值和长度,相应的子串被返回:
str = "Humpty Dumpty"
sub1 = str[7,4] # "Dump"
sub2 = str[7,99] # "Dumpty" (overrunning is OK)
sub3 = str[10,-4] # nil (length is negative)
重要地是记住偏移值和长度(字符数量),而不是开始和结束的偏移值。
负索引从字符串尾部向后计数。这种情况,索引以1为基础,而不是以0为基础。长度仍然按向前方向添加。
str1 = "Alice"
sub1 = str1[-3,3] # "ice"
str2 = "Through the Looking-Glass"
sub3 = str2[-13,4] # "Look"
可以指定Range对象。在这种情况下,Range接受字符串的范围索引。Range可以有负数,但最小的数值必须是范围的第一个。如果Range太小或初始值超出字符串则返回nil。
str = "Winston Churchill"
sub1 = str[8..13] # "Church"
sub2 = str[-4..-1] # "hill"
sub3 = str[-1..-4] # nil
sub4 = str[25..30] # nil
如果指定了正则表达式,字符匹配的模式被返回。如果没有匹配,nil被返回。
str = "Alistair Cooke"
sub1 = str[/l..t/] # "list"
sub2 = str[/s.*r/] # "stair"
sub3 = str[/foo/] # nil
如果指定字符串,如果它会做为子串出现,则它会被返回(不是则返回nil)。
str = "theater"
sub1 = str["heat"] # "heat"
sub2 = str["eat"] # "eat"
sub3 = str["ate"] # "ate"
sub4 = str["beat"] # nil
sub5 = str["cheat"] # nil
Finally, in the trivial case, a single Fixnum as index will yield an ASCII code (或者是nil如果超出范围)。
str = "Aaron Burr"
ch1 = str[0] # 65
ch1 = str[1] # 97
ch3 = str[99] # nil
重要的是认识我们在这儿描述的符号,当用于对它们赋值时,它们也充当赋值符号。
str1 = "Humpty Dumpty"
str1[7,4] = "Moriar" # "Humpty Moriarty"
str2 = "Alice"
str2[-3,3] = "exandra" # "Alexandra"
str3 = "Through the Looking-Glass"
str3[-13,13] = "Mirror" # "Through the Mirror"
str4 = "Winston Churchill"
str4[8..13] = "H" # "Winston Hill"
str5 = "Alistair Cooke"
str5[/e$/] ="ie Monster" # "Alistair Cookie Monster"
str6 = "theater"
str6["er"] = "re" # "theatre"
str7 = "Aaron Burr"
str7[0] = 66 # "Baron Burr"
你已经看到如何在字符串内完成简单置换。sub和gsub方法提供了更高级的以模式为基础的能力。还有sub!和gsub!,它们替换它们的副本。
sub方法将置换第一个给出替换字符串或指定块的匹配出现的地方。
s1 = "spam, spam, and eggs"
s2 = s1.sub(/spam/,"bacon") # "bacon, spam,
and eggs"
s3 = s2.sub(/(w+), (w+),/,'2, 1,') # "spam, bacon, and eggs"
s4 = "Don't forget the spam."
s5 = s4.sub(/spam/) { |m| m.reverse } # "Don't forget the maps."
s4.sub!(/spam/) { |m| m.reverse }
# s4 is now "Don't forget the maps."
就像例子中显示的,特殊符号1, 2, 等等可以被用做替换字符串。但是,特殊变量如$& (或$MATCH)不可以。
如果使用块形式,则特殊变量可以被使用。但是,如果你需要匹配的字符串,它将做为一个参数被传递给块。如果不需要,参数可以被删掉。
gsub方法(全局置换)本质上是一样的,除了所有的匹配都被置换而不只是第一个。
s5 = "alfalfa abracadabra"
s6 = s5.gsub(/a[bl]/,"xx") # "xxfxxfa xxracadxxra"
s5.gsub!(/[lfdbr]/) { |m| m.upcase + "-" }
# s5 is now "aL-F-aL-F-a aB-R-acaD-aB-R-a"
方法Regexp.last_match本质上与$&或者$MATCH是一样的。
发表评论
-
rsync参数详解、利用ssh、rsync 实现数据的定时同步
2012-09-11 14:52 1704http://colderboy.blog.51cto.com ... -
putty
2011-12-02 10:50 1120http://www.iteye.com/topic/5606 ... -
haml
2011-12-01 22:53 1141http://aideehorn.iteye.com/blog ... -
ruby 生成随机数 和 随机字符串
2011-11-30 22:42 3536ruby 生成随机数 和 随机字符串 1,ra ... -
ruby and watir学习之_Hash 类
2011-11-20 17:53 1655http://www.cnblogs.com/zhangfei ... -
gem相关命令使用
2011-11-19 00:01 2852http://www.cnblogs.com/orez88/a ... -
Rails,启动-重要
2011-11-17 09:59 1792http://www.blogjava.net/sshwsfc ... -
使用 RSpec 进行行为驱动测试,配置分析
2011-11-11 13:21 1589http://huangzhimin.com/ < ... -
ruby的class与module的区别
2011-11-07 10:04 2371http://blog.163.com/rettar@126/ ... -
ruby invalid multibyte char (US-ASCII)
2011-11-05 01:57 4693要加上: # encoding: utf-8 一般要 ... -
File.split(pathname)
2011-11-05 01:42 2247http://www.kuqin.com/rubycndocu ... -
Ruby怎样获取操作系统的Name
2011-11-05 01:30 1293http://bbs.chinaunix.net/thr ... -
Ruby String#unpack
2011-10-31 11:34 1299http://fuliang.iteye.com/blog/6 ... -
ruby环境变量的文件读取形式
2011-10-31 11:29 1860http://blog.csdn.net/normallife ... -
Ruby学习九 排序 sort
2011-10-26 20:06 3582h = ['1','10','11','2','4']A. p ... -
关于rails插件will_paginate的配置和用法
2011-10-26 15:56 4378http://selfcontroller.iteye.com ... -
ruby 中的 && ,|| ,!! (转)
2011-10-26 14:59 966http://selfcontroller.iteye.com ... -
Ruby中 respond_to? 和 send 的用法 .
2011-10-26 14:19 5362http://selfcontroller.iteye.com ... -
ruby 在线正则表达式 编辑器
2011-10-25 09:22 1751http://www.rubular.com/ -
ruby-Jruby,Xruby 转
2011-10-25 09:22 891ruby-Jruby,Xruby 2009年06月21 ...
相关推荐
例如,当你在Ruby中写下"hello",它实际上是一个String对象,你可以调用方法在它上面操作,如`"hello".upcase`会返回"HELLO"。 其次,Ruby的动态性允许你在运行时改变程序的行为。这意味着你可以自由地添加方法到类...
2. **简洁的语法**:由于基于Ruby的字符串插值,其语法对Ruby开发者来说非常直观,减少了学习曲线。 3. **隔离和安全性**:StringTemplate模板与业务逻辑分离,降低了模板注入攻击的风险。模板只负责呈现数据,不...
学习Ruby不仅仅是学习一门语言,更是进入一个充满活力的开发社区,能接触到各种创新的工具和技术。 总之,无论你是对编程感兴趣的新手,还是想扩展技能树的开发者,这份“Ruby入门教程中文PDF 附实例”都将是你宝贵...
Ruby是一种动态、面向对象的编程语言,而ORM(Object-Relational Mapping)是将数据库中的数据与编程语言中的对象进行映射的技术,使得...对于想要深入研究Ruby和RethinkDB的开发者来说,这是一个很好的学习资源。
MongoMapper是Ruby社区中用于MongoDB数据库的一种对象关系映射(ORM)框架,它为开发者提供了与MongoDB交互的简洁而强大的接口。MongoDB是一种非关系型数据库(NoSQL),以其灵活性、高可用性和高性能而受到青睐。...
Ruby 学习笔记 1、简介 定义:一种简单快捷的面向对象脚本语言 开发者:松本行弘 开发时间:1995年 设计目的:A PROGRAMMER'S BEST FRIEND【程序员的最佳朋友】 文件扩展名:rb 2、语言特性 真正的面向对象编程语言 ...
Ruby支持五种基本的数据类型:符号(Symbol)、字符串(String)、数字(Numeric)、数组(Array)和哈希(Hash)。变量分为四种:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头...
总的来说,这个Ruby中文手册CHM是一个全面的学习资源,适合初学者入门,也适用于有经验的开发者查阅特定信息。通过深入学习和实践,开发者可以充分利用Ruby的强大功能,创造出各种复杂的应用程序和游戏。
同时,通过阅读源码,开发者可以深入理解Ruby的内部机制,学习如何实现一个动态语言的编译器和运行时系统。这对于想要参与Ruby核心开发或者希望提升编程技能的人来说,是一份宝贵的资源。 为了编译和运行Ruby源码,...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本套官方文档包含了关于Ruby核心库、标准库、语言特性和整体框架的详细信息,是学习和深入理解Ruby不可或缺的参考资料。...
1. **变量和数据类型**:Ruby支持多种数据类型,包括整型(Integer)、浮点型(Float)、字符串(String)、布尔型(Boolean)以及符号(Symbol)。此外,Ruby还有数组(Array)和哈希(Hash)等复合数据类型。 2. ...
这对于学习和理解Ruby的语法、类库和方法非常有帮助。 5. **lib**:这个目录是Ruby的核心库和标准库所在的位置。它包含了各种内置模块和类,如`Array`、`String`、`Hash`等,以及一些实用工具,如`irb`(交互式Ruby ...
Ruby支持多种数据类型,包括整数(Integer)、浮点数(Float)、字符串(String)、布尔值(Boolean)和数组(Array)。例如: ```ruby # 整数 num = 123 # 浮点数 decimal = 3.14 # 字符串 greeting = "你好,...
String对象的定义可以使用””和”,对于单纯的字符串,推荐使用”进行定义,效率比””高,””与”的区别在于,”内的字符串定义后就是最终形态,即使如\n换行符,也会原样输出,而””更像是一个表达式,解析器会...
#### 一、Ruby 语言简介 - **定义**:Ruby 是一种开源的面向对象程序设计的服务器端脚本语言。它最初由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto,社区中常被称为 Matz)在 20 世纪 90 年代中期设计并...
Ruby 插件是 Logstash 的一个重要组成部分,它允许开发者用 Ruby 语言编写自定义插件来扩展 Logstash 的功能。本篇文章将深入探讨 Logstash 的 Ruby 插件,并通过一个 demo 示例来帮助理解其工作原理和使用方法。 ...
在Ruby中,我们通常会用到一个叫做ActiveRecord的库,它是Ruby on Rails框架的一部分,用于处理数据库操作。通过ActiveRecord,你可以创建数据库模式(schema),定义模型(model)和迁移(migration)。例如,创建...
总之,Ruby 1.8.6 API HTML 是开发者学习和使用这个版本 Ruby 的重要参考资料,它提供了全面的类库和语言特性的描述,帮助开发者编写出高效、可维护的代码。通过深入理解并熟练运用这些 API,开发者可以充分利用 ...
Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro ...对于想要深入学习Ruby的开发者来说,这个版本的文档是非常宝贵的资源,可以帮助他们理解语言的核心概念,掌握最新的特性,从而提升开发技能。