Ruby 的标准类型包括数字(Numeric)、字符串(String)、区间(Range)以及正则表达式(Regexp)。这似乎和我们以及熟悉的标准类型概念有点不同,区间还好说,正则怎么成了标准类型了?
数字
Ruby 的数字包括整数(Integer)和浮点数(Float),这些类型都直接或间接继承自 Numeric。Ruby 的整数并没有长度限制,一定范围内的整数是 Fixnum 对象,当超出该范围则会自动转换成 Bignum。
Fixnum < Integer < Numeric
Bignum < Integer < Numeric
Float < Numeric
i = 123 puts i.class i = 123 ** 123 puts i.class i = 1 puts i.class
输出:
Fixnum
Bignum
Fixnum
浮点数并没有这么复杂,所有的浮点数类型都是 Float,无论它有多长。
f = 123.45 puts f.class f = 1235743954325432875984372594372957439254.455432543254325432545254325432 puts f.class
输出:
Float
Float
和所有的语言一样,我们可以通过前导符号标定数字的格式。
- 0 : 八进制。0377
- 0d : 十进制。
- 0x : 十六进制。 0xaabb
- 0b : 二进制。0b100111100
a = 123_456_789 # 类似我们习惯的 123,456,789。 puts a
"?x" 和 "?\cx(或 ?\C-x)" 分别用于显示字符或控制字符的整数值。
puts ?a puts ?\n puts ?\r puts ?\ca # Ctrl + a
字符串
Ruby 字符串由 8bit 字节序列组成。字符串定义方式有很多种~~~ (真不知道是怎么想的?)
简单点的是用单引号或双引号,当然包括我们熟悉的转义符。
s = 'That\'s Right!' s = 'escape using "\\"' s = "Hello, World!"
其中双引号字符串内部可以使用 #{expr},这是个非常有趣的功能,显然比 C# String.Format 更方便一点。
$s = "Tom" name = "Jack" puts "My name is #{name}" # 局部变量 puts "Your name is #$s" # 全局变量可省略大括号 puts "1 + 2 + 3 = #{1+2+3}" # 表达式
另外还有更奇怪的,%q 相当于单引号,%Q 相当于双引号,还有 "here documents"。这些标记都通过特定的分界标记来定义字符串。
$s = "Tom" name = "Jack" puts %q/My name is #{name}/ puts %Q|Your name is #$s| puts <<START, <<END START 1 + 2 + 3 = #{1+2+3} 1 + 2 + 3 = #{1+2+3} 1 + 2 + 3 = #{1+2+3} END
字符串类 String 提供了大量的操作方法,细节可参考类库文档。
区间
区间表示一种序列。在 Ruby 中,使用 ".." 表示闭区间,而使用 "..." 表示半闭半开区间,区别在于闭区间包含右端的值,而半闭半开区间则不包含。
puts (1..3).to_a puts "--------------" puts (1...3).to_a
输出
1
2
3
--------------
1
2
区间不仅仅是整数,也可以是字符串等。
puts ("a".."z").to_a
区间类型 Range 提供了很多操作方法。
r = 1..9 puts r.min puts r.max puts r.include?(2) puts r === 2 # 和 include? 作用相同
正则表达式
Ruby 在语言层面提供了正则表达式的支持,我们可以用下面三种方法创建 Regexp 对象。
a = Regexp.new('[\d]+') b = /[\d]+/ puts b.class c = %r{[\d]+} puts c.class
输出:
Regexp
Regexp
我们可以用操作符 "=~" 来完成匹配(Match)操作。(操作副 "!~" 和此作用相反,是否定匹配)
s = "Number: 100234, ..." puts s =~ /[\d]+/ puts $& # 返回匹配的字符串 "100234" puts $` # 返回匹配之前的字符串 "Number: " puts $' # 返回匹配之后的字符串 ", ..."
"$~" 返回 MatchData 对象,其中包含匹配长度、偏移量等所有信息,类似 C# Match。除此之外,我们同样可以操作组(Group)。
s = "Number: 100234,234 ..." puts s =~ /([\d]+),([\d]+)/ puts $& # 返回匹配的字符串 puts $1 # Group1 "100234" puts $2 # Group2 "234"
在 Ruby String 类中,很多方法直接支持正则操作。
s = "Hello, World!" puts s.sub(/World/, 'ruby') # 替换 s = "123,456,78" puts s.scan(/[\d]+/) # 返回所有匹配数组