ruby 标准类型总结
- ruby支持整数和浮点数,整数可以是任意长度
- 一定范围内的整数以二进制存放,它们属于fixnum类型,当超出这个范围时则自动转换为bignum类型
-
表达方式:符号+一串字符,数字串中的下划线会被忽略,(前缀包括:0表示八进制, 0x表示十六进制, 0b表示二进制)123_456_789_123_345_789 # bignum
0xaabb # 十六进制 -
也可以通过在前面加上问号来得到ascii码字符对应的整数值和转义序列的值
?a # 普通字符
?\n # 换行符 (0x0a)
?\c-a # ctrl+a (0x01)
?\m-a # alt+a
?\m-\c-a # ctrl+alt+a
?\c-? # 删除键 - 一个带小数点的数字字面值被转换成float对象
-
所有的数字都是对象,不存在相应的函数而是方法
exp:
数字的绝对值是anumber.abs而不是abs(anumber) - 整数有用的迭代器
3.times { print "x " } => x x x 1.upto(5) { |i| print i, " " } =>1 2 3 4 5 99.downto(95) { |i| print i, " " }=>99 98 97 96 95 50.step(80, 5) { |i| print i, " " }=>50 55 60 65 70 75 80
- ruby的字符串是8位字节的简单序列,字符串是string类的对象
- 注意转换机制(注意单引号与双引号的区别),如:
单引号中两个相连的反斜线被替换成一个反斜线,,一个反斜线后跟一个单引号被替换成一个单引号
'escape using "\\"' >> 转义为"\" 'that\'s right' >> that's right
-
双引号支持多义的转义
"\n"
#{expr}序列来替代任何的ruby表达式的值 ,(全局变量、类变量或者实例变量,那么可以省略大括号)
"seconds/day: #{24*60*60}" >> seconds/day: 86400 "#{'ho! '*3}merry christmas" >> ho! ho! ho! merry christmas "this is line #$." >> this is line 3 - here document来创建一个字符串,end_of_string 为结束符号
astring = <<end_of_string the body of the string is the input lines up to one ending with the same text that followed the '<<' end_of_string -
%q和%q分别把字符串分隔成单引号和双引号字符串(即%q与%q后面的符号具有',"的功能)
%q/general single-quoted string/ >> general single-quoted string -
string 常用功能
string#split:把行分解成字段
string#chomp:去掉换行符
string#squeeze:剪除被重复输入的字符
string#scan:以指定想让块匹配的模式
exp:
/jazz/j00132.mp3 | 3:45 | fats waller | ain't misbehavin'
/jazz/j00319.mp3 | 2:58 | louis armstrong | wonderful world
#文件格式如上,要进行分解
songs = songlist.new
songfile.each do |line|
file, length, name, title = line.chomp.split(/\s*\|\s*/)#先chomp,后再分解,/\s*表示任字符
name.squeeze!(" ")#替换空格
mins, secs = length.scan(/\d+/)#这里用scan匹配模式
songs.append song.new(title, name, mins.to_i*60+secs.to_i)
end
- 区间存在于任何地方,如:1到12月。ruby用区间实现了3个不同的特性:序列,条件,间隔。
-
"..":两个点号创建一个闭区间,"...":而三个点号创建一个右开区间(即右边界不取值)
exp:0..anarray.length-1 等同于 0...anarray.length -
to_a 把区间转换成列表
exp: ('bar'..'bat').to_a >> ["bar", "bas", "bat"] -
区间的共它的用法
digits = 0..9
digits.include?(5) >> true
digits.min >> 0
digits.max >> 9
digits.reject {|i| i < 5 } >> [5, 6, 7, 8, 9]
digits.each do |digit|
dial(digit)
end - ruby能把基于自己定义的对象的区间,要求:这个对象必须能够响应succ方法来返回序列中的下一个对象,并且这个对象必须能够使用<=>运算符来被比较,即常规的比较运算符,
-
间隔测试
puts (1..10).include?(3.14)=> ture
puts (1..10) === 3.14 => ture
- 正则表达式是regexp类型的对象,可以使用构造器显式地创建一个正则表达式,也可以使用字面值形式/pattern/和%r\pattern\来创建
-
用regxp#match(astring)的形式或者匹配运算符=~(正匹配)和!~(负匹配)来匹配字符串了。匹配运算符在string和regexp中都有定义,如果两个操作数都是字符串,则右边的那个要被转换成正则表达式
exp:
a = "fats waller"
a =~ /a/ >> 1
a =~ /z/ >> nil
a =~ "ll" >> 7 -
上面返回的是匹配字符的位置,其它
$&接受被模式匹配到的字符串部分
$`接受匹配之前的字符串部分
$'接受之后的字符串。
exp:下面的方法后继都会用到
def showre(a,re)
if a =~ re
"#{$`}<<#{$&}>>#{$'}" #返回前、中、后
else
"no match"
end
end
-
模式,任何一个表达式都包含一个模式,它用来把正则表达式和字任串匹配
模式中除了., |, (, ), [, {, +, \, ^, $, *,和?以外的字任都匹配它自己
如果要匹配这些特殊的字符就需要加上反斜线做前缀,分析上面例字
/\s*\|\s*/,在\s与|之前都加了/做前缀。
showre('kangaroo', /angar/) >> k<<angar>>oo
showre('!@%&-_=+', /%&/) >> !@<<%&>>-_=+
showre('yes | no', /\|/) >> yes <<|>> no
- \后跟一个字母或数字表示一个特定的结构如\s表示字符等。
- 锚点 一个正则表达式总是返回找到模式的第一个匹配,如何改变?
模式^和$分别用来匹配行首和行尾
序列\a匹配字符串开始的位置,\z和\z匹配字符串结尾的位置
\b和\b分别匹配字边界和非字边界
showre("this is\nthe time", /^the/) >> this is\n<<the>> time
showre("this is\nthe time", /is$/) >> this <<is>>\nthe time
showre("this is\nthe time", /\athis/) >> <<this>> is\nthe time
showre('it costs $12.', /[aeiou]/) >> it c<<o>>sts $12.
a = 'gamma [design patterns-page 123]'
showre(a, /[]]/) >> gamma [design patterns-page 123<<]>>
showre(a, /[b-f]/) >> gamma [<<d>>esign patterns-page 123]
showre(a, /[-]/) >> gamma [design patterns<<->>page 123]
showre(a, /[0-9]/) >> gamma [design patterns-page <<1>>23]
序列 形如 [ ... ] 含义
\d [0-9] digit character
\d [^0-9] nondigit
\s [\s\t\r\n\f] whitespace character 匹配一个单空白符
\s [^\s\t\r\n\f] nonwhitespace character
\w [a-za-z0-9_] word character
\w [^a-za-z0-9_] nonword character
r * 匹配0个或多个r的出现
r + 匹配一个或多个r的出现
r ? 匹配0个或1个r的出现
r {m,n} 匹配最少m最多n个r的出现
r {m,} 匹配最少m个r的出现
重复结构有高优先权:即它们仅和模式中的直接正则表达式前驱捆绑
/ab+/匹配一个"a"后跟一个活着多个"b",而不是"ab"的序列
/a*/会匹配任何字符串:0个或者多个"a"的任意字符串。
exp:
a = "the moon is made of cheese"
showre(a, /\w+/) >> <<the>> moon is made of cheese
showre(a, /\s.*\s/) >> the<< moon is made of >>cheese
showre(a, /\s.*?\s/) >> the<< moon >>is made of cheese
showre(a, /[aeiou]{2,99}/) >> the m<<oo>>n is made of cheese
showre(a, /mo?o/) >> the <<moo>>n is made of cheese
"|"既匹配它前面的正则表达式或者匹配后面的
a = "red ball blue sky"
showre(a, /d|e/) >> r<<e>>d ball blue sky
showre(a, /al|lu/) >> red b<<al>>l blue sky
showre(a, /red ball|angry sky/) >> <<red ball>> blue sky
圆括号把正则表达式分组,组中的内容被当作一个单独的正则表达式
showre('banana', /(an)+/) >> b<<anan>>a
# 匹配重复的字母
showre('he said "hello"', /(\w)\1/) >> he said "he<<ll>>o"
# 匹配重复的子字符串
showre('mississippi', /(\w+)\1/) >> m<<ississ>>ippi
你是否想过,大小写替换。
方法string#sub和string#gsub都在字符串中搜索匹配第一个参数的部分,然后用第二个参数来替换它们。string#sub只替换一次,而string#gsub替换所有找到的匹配。都返回一个包含了替换的新的字符串的拷贝。进化版本是string#sub!和 string#gsub!
a = "the quick brown fox"
a.sub(/[aeiou]/, '*') >> "th* quick brown fox"
a.gsub(/[aeiou]/, '*') >> "th* q**ck br*wn f*x"
a.sub(/\s\s+/, '') >> "the brown fox"
a.gsub(/\s\s+/, '') >> "the"
第二个参数可以是代码块
a = "the quick brown fox"
a.sub (/^./) { $&.upcase } >> "the quick brown fox"
a.gsub(/[aeiou]/) { $&.upcase } >> "the quick brown fox"
\& 后面的匹配
\+ 后面的匹配组
\` 匹配前面的字符串
\' 匹配后面的字符串
\\ 反斜线的字面值
正则表达式的字面值创建regexp类
re = /cat/
re.type >> regexp
方法regexp#match从字符串中匹配一个正则表达式,如果不成功,方法返回nil,如果成功,返回matchdata类的一个实例
exp:
e = /(\d+):(\d+)/ # match a time hh:mm
md = re.match("time: 12:34am")
md.type >> matchdata
md[0] # == $& >> "12:34"
md[1] # == $1 >> "12"
md[2] # == $2 >> "34"
md.pre_match # == $` >> "time: "
md.post_match # == $' >> "am"