ruby的基本类型包括数字,字符串,数组,符号,散了表,区间和正则表达式,这些基本类型都是以类的形式定义的
数字:
ruby中的数字分为整形(Integer)、浮点数(Float)、复数(Complex)这三种。其中整数又分为定整数(Fixnum)和大整数(Bignum)。
Integer
整数的书写例子:
#书写整数时,可根据需要在数字之间任意加入下划线而不会影响数字的值 a=123_456_789 puts a #=>123456789 puts 0b100100 #二进制 =>36 puts 0123 #八进制 =>83 puts 0xa0 #十六进制 =>160
运算方法为
+,-,*,/ 加减乘除
% 取模运算 4%3=>1
| , &, ^ 按位与,按位或,按位异或
<<,>> 左右移位运算
<=> 比较整数大小,前者大于后者返回1,相等返回0,小于返回-1
常用方法
abs 返回数字的绝对值
chr 返回数字对应的ASCII编码对应的符号
times 循环整数此说的迭代方法 例:3.times{ |i| puts i }
downto 从大到小进行迭代,使用方法如: 5.downto(1){ |i| puts i } 输出: 5 4 3 2 1
upto 从小到大进行迭代,使用方法如: 2.upto(5){ |i| puts i } 输出: 2 3 4 5
to_s 将正说变为字符串类型
Float
浮点数的运算与整数类似,但有几个特殊的方法
ceil 返回比浮点数大的最小整数
floor 返回比浮点数小的最大整数
round 对浮点数四舍五入为一个整数
to_i 返回截取掉小数点后面数字后的整数
Ruby内置有一个Math的模块,包含常见的数字相关运算的支持。
字符串String
ruby中通常使用单引号或者双引号包含 例如:
str = "this is a string" str = 'this is a string
还可以使用%,%q,%Q表示法 例如:
puts %{test\t,"this is a test"} puts %q{test\t,this ia a "test"} puts %Q{test\t,this is a 'test'}
输出
test ,"this is a test" test\t,this ia a "test" test ,this is a 'test'
可以看出,%q是不支持转义字符的
ruby还提供了一个称为here文档的字符串标示方法,适合显示多行的大段文字 例如:
str = <<here 输入多行文本 输入多行文本 输入多行文本 输入多行文本 here
输出
输入多行文本 输入多行文本 输入多行文本 输入多行文本
字符串的基本操作
puts "abcdfe"[0] #输出第0位的字符 puts "abcdfe"[0,2] #输出第0为到第0+2-1位的字符串 puts "abcdfe"[0..2] #输出第0位到第2位的字符串 puts "abcdfe"[0]="2" #将第0位的字符替换为2 puts "abcdfe"*2 #返回原来字符串重复2次后的新字符串 puts "abcdfe"+"hello" #将原来的字符串后面加上hello puts "abcdfe"<<"hello" #同上
输出:
a ab abc 2 abcdfeabcdfe abcdfehello abcdfehello
字符串的常用方法
str = "abcdef" str.length str.size str.concat(obj) #追加字符串,如果obj为数字并且在0-255之间则运算前自动转换为一个相应的字符 str.capitalize #将字符串首字母大写,其他字符小写 str.delete("abf") str.each_byte { |fixnum| puts fixnum} #对字符串的每个字节进行迭代 str.each_char { |cstr| puts cstr } #对字符进行迭代 str.each_line { |substr| } #对每行进行迭代 str.strip #去除字符串首尾的非可见字符,返回新字符串.非破坏形方法 str.downcase #字符串转换为小写 str.upcase #字符串转换为大写 str.include?(string) #如果字符串包含string则返回true,否则返回false str.index(string) #返回字符串string首次出现的位置,rindex方法从后开始检索 str.reverse #将字符串顺序反转 str.split(pattern) #基于分隔符pattern将字符串str分割成若干子字符串,以数组形式返回 str.scan(pattern) #检索出str中所有匹配pattern的子字符串,并以数组的形式返回
符号Symbo l
符号是Symbol类的实例,通常情况下,使用冒号加上一个标示符即可创建一个符号。
:"a symbol" :"()22"
符号不同于字符串的地方是:相同标示符在任何地方均引用的是一个相同的实例。而相同的字符串则可能是不同的对象
符号的优点是内存消耗较少,适合于需要保证名称和变量一一对应的情况。实际使用中,如枚举值,关键字都会选择符号
可枚举模块的一些方法
#enum.all?{|obj| block} 判断是否集合中所有元素都满足某个条件 [1,2,3,4].all? { |i| i>2 } #返回false #enum.any?{|obj| block} 判断是否集合中有任意一个元素满足条件 [1,2,3,4].any? { |i| i>3 } #true #enum.collect{|obj| block} 集合中的每个元素调用block的结果,以数组的形式返回 [1,2,3,4].collect { |i| i+1 } #[2,3,4,5] #enum.each_with_index{|obj,i|block} obj为集合中的元素,i为该元素的下标 [0,1,2,3].each_with_index { |obj,i|puts "#{obj}--#{i}" } #enum.find(ifnone=nik){|ojb| block} 返回第一个条件成立的元素 [0,1,2,3].find { |obj| obj=3 } #enum.find_all{|obj| block} 找出所有符合条件的元素,返回一个数组 [0,1,2,3].find_all { |obj| obj>1 } #[2,3] #enum.include?(obj) 检测集合中是否包含obj [0,1,2,3].include?(1) #true #enum.inject(initial=nil){|memo,obj|block} 每一步memo参数都会被设置为block的结果,传入下一步运算 [1,2,3,4].inject { |memo,obj| memo+obj } #返回10 #enum.partition{|obj| block} 按照某个条件分割为俩个数组并返回 [1,2,3,4].partition { |i| i>2 } #返回[[1,2],[3,4]] #enum.max 返回集合中最大的元素 [1,2,3,4].max #4 #enum.max{|a,b| block} 自定义比较内容 puts [1,2,3,4].max { |a,b| a<=>b } #enum.min和enum.min{|a,b| block} 参考如上 #enum.sort,enum.sort{|a,b| block} 给集合排序 默认是按照小>大的顺序 [4,3,2,1].sort #[1,2,3,4] #enum.sort_by{|obj| block}根据某种规则对集合中的元素进行排序 ["str","strstr","strstrstr"].sort_by { |obj| obj.length }
关于Array
创建数组对象最标准的方式是:a = Array.new
或者 a = Array.new(5) 创建包含5个nil元素的数组
或者a = Array.new(5,1) 创建包含5个1的数组
最简单的方式是a = [] 或者 a = [1,1,1,1]
或者使用%w,可以创建不包含空格的数组
如:%w(tt ww kk ss) 返回 ["tt","ww","kk","ss"]
Array还具有并行赋值的能力,把等号右边的元素依次赋值给左边
如:
a,b,c = ["string",20,[1,2]] puts "#{a} #{b} #{c}"
输出
string 20 [1, 2]