ruby类简介
1、Integer类与Fixnum类和Bignum类数值之间可以相互转换。Integer对象与Float对象互相计算,结果是Float对象。Integer对象之间的运算结果是Integer对象,Float对象之间的运算结果也是Float对象
2、数据类型转换
to_f :转换成Float对象
to_i :转换成Integer对象
to_s :转换成String对象
to_a : 转换成Array对象
3、Math模块:Ruby内置Math模块,可直接调用Math的方法。
4、Numeric类的方法
round:四舍五入,去掉小数点后的值
ceil:返回比当前数值的大的最小整数
floor:返回比当前数值小的最大整数
5、迭代器
n.times{|i| ...} :重复n次
(n..m).each{|i| ...} :从n到m,包含m
(n...m).each{|i| ...}:从n到m,不包含m
6、生成随机数,生成0-9之间的随机整数
a=rand(10)
1、生成文本字符
单引号:Ruby对字符串文字值不做任何处理,所输入的文本就是该字符串的值。
双引号:会在文本中会查找要替换的字符,解译“\n”之类的特殊字符。字符串中用“#{}”框住的部分会当成Ruby语句执行,并将运算结果插入(内嵌表达式)。
使用%q和%Q建立单行或多行文本字符:%q等于单引号括住的文本,%Q等于双引号括住的文本。可以用斜线、括号等字符括住。
2、字符文本连接
"+":通过加号连接两个字符串,返回新的字符串。
"<<"和concat("字符串"):将后面的字符串加入前面的字符串末端,返回被修改后的前面字符串。
3、字符串操作
# 将字符串s的一部分换成str
s[n]=str
s[n..m]=str
s[n,len]=str
# 删除字符串s的一部分,返回值是删除的部分
s.slice!(n..m)
s.slice!(n,len)
4、String类常用方法
# 带感叹号与不带感叹号方法之间的区别是带感叹号为不可逆方法会破坏字符串,不带感叹号会返回新的字符串
empty?:字符长度是否为0
split("分隔符")或者split(/匹配模式/):分割字符文本,返回分割后字符串组成的数组。
chop和chop!:删除字符串最后一个字符
chomp和chomp!:删除行尾的换行字符
index("索引字符串"):从字符串左边查找是否包含指定字符串,返回找到的指定位置,未找到则返回nil。(rindex是从右边查找)
sub(/正则表达式/,”替换的值”)和sub!破坏性方法:取代最先找到的地方
gsub(/正则表达式/,”替换的值”)或者gsub(“被替换的值”,”替换的值”)还有gsub!破坏性方法:取代所有找到的地方
delete(str)和delete!(str):从字符串中删除指定的字符
reverse 和reverse!:逆转字符串
strip和strip!:清除字符串前后的空格
size和length:返回字符串长度
scan(/匹配模式/):搜索字符串中所有匹配的字串,并以数组形式返回。
5、String类字符转换方法
upcase和upcase!:小写转大写
downcase和downcase!:大写转小写
swapcase和swapcase!:大写转小写,小写转大写
capitalize和capitalize!:第一个字母转换成大写,其他全部改为小写
to_sym:将字符串转换成符号(Symbol)
6、迭代器
each_byte{|s| ...}
each_line{|s| ...}
7、字符串加密
Ruby中字符串对象包含名为crypt方法,可以非常方便的实现DES加密。
puts "hello".crypt("salt")
Ruby提供了一个扩展类实现MD5
require 'md5' puts MD5.new("hello").hexdigest
枚举:可以视为是可以搜索、可遍历以及可以排序的集合。可枚举模块中的方法大致可以分为两类:一类是遍历和搜索方法,适合对无序的集合进行操作,另一类是比较、排序方法,当集合类元素之间具有比较方法(<=>)时,可以进行操作。
1、遍历、搜索方法
enum.all?{|obj| ...}:判断集合中是否所有元素都满足条件,返回true或者false
enum.any?{|obj| ...}:判断集合中是否有任意一个元素满足条件,返回true或者false
enum.collect{|obj| ...}:集合中每个元素调用block,以数组的形式返回运行后的结果
enum.each{|obj| ...}:集合中每个元素调用block,无返回。
enum.each\_with\_index{|obj,i| ...}:跟each用法相同,多一个表示集合所处位置元素。
enum.find(ifnone=nil){|obj| ...}:返回集合中符合条件的一个元素,如果没找到,则返回ifnone
enum.find_all{|obj| ...}:返回集合中所有符合条件的元素
enum.select{|obj| ...}:与find_all方法相同
enum.include?(obj):判断集合中是否包含obj
enum.inject(initial=nil){|memo,obj| ...}:遍历集合,memo累计遍历过程中运行的结果,memo的初始值为initial,否则以第一个元素的值为memo的初始值。
enum.partition{|obj| ...}:将集合按照某个条件分割,第一个数组含有集合是满足条件为true的元素,另一个数组是满足条件为false的元素
2、比较、排序方法
enum.max:返回集合中最大的元素
enum.max{|a,b| ...}:这是max的第二种功能,可以自定义比较的内容,比如比较a.length <=> b.length 取最大的长度
enum.min,enum.min{|a,b| ...}:与max方法类似,不过返回的是集合中最小的元素。
enum.sort,enum.sort{|a,b| ...}:返回按照元素大小排序后的集合,与max、min方法类似
enum.sort_by{|obj| ...}:根据某个规则对元素进行排序。sort_by与sort类似,不过相对更耗费资源些。sort_by可以支持多级排序,sort_by{|a|[a.length,a]}先按字符长度然后按字母顺序排序。
1、区间表示:".."和"..."。两点表示闭合区间(包括终点的值),三点表示半开半闭区间(不包括终点的值)
2、区间具有所有Enumerable模块所提供的方法。区间还有些独有的方法。
first和begin:返回区间第一个元素
end和last:返回区间最后一个元素
Ruby是弱类型的脚本语言,数组中各个元素的类型可以互不相同,而且数组的长度可变。如果向一个超出数组末尾的元素进行赋值,数组将会动态增长,而且用nil填充那些多出来的位置,但是,向超出数组开头的元素赋值是错误的。
数组第一个元素索引为0,size和length方法返回一个数组中元素的个数,数组中最后一个元素的索引是size-1。负索引将从数组的末尾开始计数,因此通过-1访问数组最后一个元素。如果试图读取一个超出数组末尾(大于或等于size)或数组开头(小于-size)的元素,ruby会返回nil而不会抛出异常。
1、建立数组
使用“[]”或者Array.new建立数组
使用%w{...}或者%W{....}建立数组,数组之间用空格隔开,String类型不需要用单引号或者双引号包裹。%W会对字符串中的转义字符和特殊字符进行替换。(也可以使用括号等分隔符进行包裹)
2、数组索引
n…m返回a[n]到a[m-1]之间的元素,当m超过数组实际长度时,则等于指定数组的最后一个元素
a[n]
a[n..m] 或 a[n…m]
a[n,len]
3、集合数组
# 交集:获取两个数组都有的元素
array=arrray1&array2
# 并集:获取任一方数组有的元素,会去除重复元素
array= array1 | array2
# 差集
array= array1 – array2
# 合集:保留重复元素
array= array1 + array2
# 重复数组:返回重复元素组成的数组
array * n
4、数组方法(带有感叹号的方法都是破坏性方法)
"<<"方法:向数组的尾部添加一个数组元素
“+”:将前后数组连接起来,非破坏性方法,返回一个新的数组
concat(数组):将前面数组跟指定数组连接起来,concat是破坏性方法,会修改前面数组
compact和compact!:删除数组中nil元素
delete(数组元素):删除数组中指定元素,返回删除的元素,破坏性方法
delete_at(n):删除数组指定n位置的元素,返回删除的元素,破坏性方法
uniq和uniq!:删除数组中重复的元素
flatten和flatten!:将数组扁平化,当数组中嵌套数组,将嵌套元素展开形成大数组。
reverse和reverse!:逆转数组
sort和sort!:数组排序
empty?:判断是否是空数组
join("分隔符"):将数组根据分隔符组成字符串
to_s:返回self.join
clear:清空数组
insert(index,obj):在指定位置插入元素到数组
replace(other_array):使用other_array替换数组内容
pop/shift:删除数组最后一个/第一个元素
first/last:读取数组第一个/最后一个元素
push(obj)/unshift(obj):向数组最后/第一位插入元素
5、迭代器
数组也是具有可枚举能力的类型,它具有Enumerable模块所提供的方法
delete_if{|item| ....}、reject{|item| ...}和reject!{|item| ....}:从数组中删除满足条件的元素。
collect{|e| ...}、collect!{|e| ....}、map{|e| ....}和map!{|e| ....}:对数组每个元素进行区块里的运算,运算后的结果重新组成新的数组。
sort_by{|i| ...}、sort{|i,j| ...}和sort!{|i,j| ...}:数组按照区块的条件进行排序
each{|e| ...}:循环数组执行区块内代码
each_with_index{|e,i| ...}:循环数组执行区块代码。i表示索引位置
select{|e| ...}:选择满足的条件的元素组成新的数组
ary1.zip(ary2, ary3){|a,b,c| result << a+b+c}:多数组运算
1、建立hash
Hash对象:{键 => 值},由key和value组成,key是唯一的,key和value之间由“=>”或者“:”隔开,多个key-value对之间用逗号隔开
Hash访问:Hash[key]方式访问对应key的value
Hash对象中,如果为同一个key指定了两次值,后指定的值将覆盖前面指定的值
Hash键(key)的对象选择:字符串(String)、数字(Numeric)、符号(Symbol)和日期(Date)
2、hash方法
size和length:返回hash长度
include?(key)和has_key?(key):判断hash是否包含指定key
delete(key):删除hash中指定key的对应元素,返回删除的键值
keys:返回hash中全部key组成的数组
values:返回hash中全部value组成的数组
index(value):为给定的 value 返回哈希中的 key,如果未找到匹配值则返回 nil
inspect:返回哈希的打印字符串版本
merge(other_hash)和merge!(other_hash)、merge(other_hash) { |key, oldval, newval| block }:返回一个新的哈希,包含 hash 和 other_hash 的内容,重写 hash 中与 other_hash 带有重复键的键值对
to_a:hash转成数组
to_s:把 hash 转换为一个数组,然后把该数组转换为一个字符串
has_key?(key)和has_value?(value):hash中是否包含某个key或者value
3、迭代器
hash也是具有可枚举能力的类型,它具有Enumerable模块所提供的方法
each{|key,value| ...}、each\_key{|key| ...}、each\_value{|value| ...}、each_pair{|key,value| ...}、each{|e| key=e[0];value=e[1]}:遍历hash
delete_if{|key,value| ...} :删除符合条件的元素,返回删除后的hash。如果未找到符合的元素则返回原来的hash,破坏性方法
reject!{|key,value| ...}:删除满足条件的元素,返回删除后的hash,如果未找到符合条件的元素则返回nil。(方法带!表示对原来hash的修改,不带感叹号不会修改原来的hash)
select{|key,value| ...}:返回选择满足条件的元素组成的新的hash
1、Time类对象
# 创建现在时间的Time对象
Time.new
Time.now
# 获取时间的各项元素
t=Time.now
t.year | t.month | t.day |t.hour |t.min |t.sec # =>年、月、日、时、分、秒
t.wday # 一周的第几天(星期日是0)
t.mday # 一个月的第几天
t.yday # 一年的第几天(1月1日为1)
以指定的时间建立Time对象,可以使用Time.mktime,年为必选参数
Time.mktime(年,月,日,小时,分钟,秒,微秒)
Time类对象相减可得到秒数
Time类对象可以直接加减指定的秒数
指定Time类对象时间格式转成字符串
Time.now.strftime(“%Y-%m-%d %H:%M:%S”)
将字符串转换成Time类对象
Time.parse(“2006/4/5”)
2、DateTime类对象
# 创建DateTime类对象
t=DateTime.now | DateTime.new()
t.year | t.month | t.day |t.hour |t.min |t.sec
t.wday |t.mday | t.yday
# 格式化DateTime类对象转成字符串
t.strftime(“%Y/%m/%d %H:%M:%S”)
# DateTime对象转换成Time对象
t.to_time
# 将字符串转换成DateTime对象
DateTime.parse(“2015/6/1”)
DateTime类和Time类的区别: DateTime对象之间进行计算是以日为单位,Time对象之间进行计算是以秒单位
3、Date类对象
# Date类是没有时间部分的日期
d=Date.today | Date.new(2005,1,1)
d.year | d.month | d.day
# Date对象相减得到是日数的差,Date对象加减某个整数,可以得到该日期前后的日期。使用”>>”运算符,可以获取几个月后的同一天的Date对象,使用”<<”运算符,可以获取几个月前同一天的Date对象。
# 格式化Date对象转成字符串,但与时间有关系的值为0
Date.today.strftime(“%Y/%m/%d”)
# 将字符串转换成Date对象
Date.parse(“2005/1/1”)
File和Dir继承自IO类,所以很多IO类方法都可以直接使用
1、File类常用方法(文件路径指相对路径和绝对路径)
File.exist?(文件路径)和File.exists?(文件路径):判断指定文件或目录是否存在,文件存在返回true,否则返回false
File.file?(文件路径):判断是否为文件
File.directory?("file_path"):判断是否为目录
File.new(文件路径)和File.open(文件路径):实例化File类,也表示打开文件,open方法还可以后面跟块代码File.open(文件路径){|file|}
close:关闭打开的文件
path:返回已打开文件的相对路径
read(length,buf):两个参数可选,length表示读取文件内容的字节数,buf表示用于保存读取的内容。read方法读取文件不是每次从文件开头读取,每读一次,文件指针会移动一次
readlines:一次读取文件所有行,并把所有行的内容保存到数组中,数组每个元素都是文件中的一行内容
gets:从文件中读取一行,gets执行到末尾时,返回nil,不会产生异常
each{|line| ....}和each_line{|line| ...}:迭代器,依次将文件里的每行传入代码块
each_byte{|byte| ...}:迭代器,按字节读取文件内容进行迭代
print(文本):将一行或多行字符串写入文件,并且不换行
puts(文本):将一行或多行字符串写入文件,每次写入后自动换行
write(文本):将一行字符串写入文件
File.delete(文件路径):删除文件,删除成功返回删除文件个数,否则返回Errono::error异常
File.rename(原文件名,新文件名):重命名文件。如果第一个参数和第二个参数目录名不同,将会移动文件。如果目标目录中有同名文件则会进行覆盖。成功移动文件或成功重命名文件就返回0,否则引发Errono::error异常
File.dirname(文件相对路径):获取目录名
File.basename(文件相对路径,文件扩展名):获取文件名。如果提供第二个参数,即指定了扩展名,那么获取的文件名将不具有扩展名
File.basename("/tmp/test.txt") => "test.txt"
File.basename("/tmp/test.txt",".txt") => "test"
File.basename("/tmp/test.txt",".*") => "test"
File.extname(文件路径):获取文件扩展名
File.split(文件相对路径):返回数组,有两个元素,一个是目录名,一个是文件名
File.expand_path(文件相对路径):可以通过相对路径获取绝对路径
File.join(字串1,字串2,...,字串N):根据提供的字符而生产新的路径
2、Dir类常用方法(目录路径指的是相对和绝对路径)
Dir.getwd和Dir.pwd:获取当前目录完整路径,如果获取不了会引发Errono::error
each{|name| ..}:迭代目录项
Dir['/tmp/*'].each{|child|puts child}
Dir.entries(目录路径):返回数组,数组包含了目录所有项
Dir.delete(目录路径):删除指定目录。成功返回0,否则引发Errno::ENOENT或者Errno::ENOTEMPTY异常。删除非空目录时会产生异常,因此删除目录前要判断目录是否为空(File.directory?(目录路径)),或者使用异常机制处理异常
Dir.open(目录路径):打开目录,跟File.open用法一样
close:关闭目录