概述
Ruby字符串
单引号字符串
单引号字符串没什么好说的,跟别的语言没什么区别
双引号字符串
在双引号字符串里面可以使用#{}来表达计算式的值,比如
x, y = 12, 36
puts "x + y 的值为 #{ x + y }"
如果你就是想同时用单引号和双引号,Ruby还提供 %Q 和 %q 来引导的字符串变量, %q 使用的是单引号规则, %Q 使用的是双引号规则
比如
desc1 = %Q{Ruby 的字符串可以使用 '' 和 ""。}
desc2 = %q|Ruby 的字符串可以使用 '' 和 ""。|
puts desc1
puts desc2
个人理解:这个功能简直就是蛋疼,虽然考虑到了极端情况,但是别的语言中,比如javascript也是这样的规则,但是都没出过什么大的问题,没有必要增加这种函数。反而降低了可读性
转义字符
没什么好说的,跟别的语言差不多,需要的时候查看表格就行了
字符串内建方法
内建方法有很多,有几个比较引起我的注意- str == obj 检查 str 和 obj 的相等性。如果 obj 不是字符串,则返回 false,如果 str <=> obj,则返回 true,返回 0。
- str =~ obj 根据正则表达式模式 obj 匹配 str。返回匹配开始的位置,否则返回 false
- str.capitalize 把字符串的首字母转换为大写字母显示。
- str.capitalize! 把字符串的首字母转换为大写字母显示。但是 str 会发生变化并返回,后面所有函数后面加感叹号都是表示会修改原本的变量
- str.casecmp 不区分大小写的字符串比较,比较的结果是数字,-1, 0 ,1
- str.count(str, ...)给一个或多个字符集计数。如果有多个字符集,则给这些集合的交集计数
- str.crypt(other_str) 给字符串加密,注意:这个方法是一个单向加密,并且other_str是一个2个字符的salt (长于2位字符的字符会被忽略,除非用$符号,但是用法实在太怪了),并且只有前8个字符会被加密,总之此方法甚怪,最好用专门的module比如BASE64或者Digest来做加密
- str.delete(other_str, ...) 返回 str 的副本,参数交集中的所有字符会被删除
- str.delete!(other_str, ...) 与 delete 相同,但是 str 会发生变化并返回。很多方法加上!意思就是把调用该方法的实例自己给改了,具体要用的时候可以查查手册看该方法是否有对应的加!的版本
- str.downcase 把字符串转小写 相对的 str.upcase 是讲字符都转换为大写
- str.each_line(separator=$/) { |substr| block } 使用参数作为记录分隔符(默认是 $/)分隔 str,传递每个子字符串给被提供的 block。这个是逐行处理,还有
逐词处理(空格分隔)和逐字节处理,具体请参考手册
- str.empty? 如果 str 为空(即长度为 0),则返回 true
- str.gsub(pattern, replacement) [or] str.gsub(pattern) { |match| block } 返回 str 的副本,pattern 的所有出现都替换为 replacement 或 block 的值。
- str.size str.length 两个都可以返回字符串长度,估计内部是一个实现,但是不知道谁是谁的别名,Ruby的方法名太多是个致命伤
- str.match(pattern) 正则表达式,具体后面细说
- str.lstrip 去除头部空格 str.rstrip 去除尾部空格,合起来用就是个trim,比如 a.lstrip.rstrip
- str.replace(other_str) 把 str 中的内容替换为 other_str 中的相对应的值,第一眼看到还以为是指定字符串替换,但其实是整个字符串替换然后返回替换后的文本,然而并没有什么卵用的方法
- str.split(pattern=$;, [limit]) 切割字符串,具体用法还挺复杂的,需要用的时候可以查手册
- str.unpack(format) 字符串解码,看起来支持很多的参数很牛逼的样子,其实文档晦涩难懂,真的要用的话直接用 MD5, Digest 和 Base64 会更好,可读性也更高
Ruby数组
创建数组
通过new创建数组,还可以设置默认值
a = Array.new(4,"new")
puts a
还可以用[]来创建
nums = Array.[](1, 2, 3, 4,5)
或者
nums = Array[1, 2, 3, 4,5]
数组内建方法
- array & other_array 返回一个新的数组,包含两个数组中共同的元素,没有重复,就是取交集
- array + other_array 返回一个新的数组,新数组通过连接两个数组产生第三个数组创建的。
- array - other_array 返回一个新的数组,新数组是从初始数组中移除了在 other_array 中出现的项的副本。Ruby可以随意的对数组进行加、减、取交集等操作才是很贴心的
- array | other_array 通过把 other_array 加入 array 中,移除重复项,返回一个新的数组。
- array == other_array 如果两个数组包含相同的元素个数,且每个元素与另一个数组中相对应的元素相等(根据 Object.==),那么这两个数组相等。
- array.at(index) 返回索引为 index 的元素。一个负值索引从 self 的末尾开始计数。如果索引超出范围则返回 nil
- array.assoc(obj) 搜索二维数组,使用 obj.== 把 obj 与每个包含的数组的第一个元素进行比较。如果匹配则返回第一个包含的数组,如果未找到匹配则返回 nil。说通俗了就是用首元素来搜索二维数组的
- array.collect { |item| block } [or] array.map { |item| block } 为 self 中的每个元素调用一次 block。创建一个新的数组,包含 block 返回的值。
- array.delete(obj) [or] array.delete(obj) { block } 从 self 中删除等于 obj 的项。如果未找到相等项,则返回 nil。如果未找到相等项且给出了可选的代码 block,则返回 block 的结果。
- array.delete_at(index) 删除指定的 index 处的元素,并返回该元素。如果 index 超出范围,则返回 nil。
- array.delete_if { |item| block } 当 block 为 true 时,删除 self 的每个元素。
- array.each { |item| block } 为 self 中的每个元素调用一次 block,传递该元素作为参数。
- array.empty? 如果数组本身没有包含元素,则返回 true。
- array.fill(obj) 填充数组,还可以跟上block
- array.reject! { |item| block } 当 block 为真时,从 array 删除元素,如果没有变化则返回 nil。相当于 Array#delete_if。
- array.sort! [or] array.sort! { | a,b | block } 把数组进行排序
assoc
关于assoc的搜索功能,举个例子你们立马就明白是怎么回事了
s1 = [ "colors", "red", "blue", "green" ]
s2 = [ "letters", "a", "b", "c" ]
s3 = "foo"
a = [ s1, s2, s3 ]
puts a.assoc("letters") #=> [ "letters", "a", "b", "c" ]
puts a.assoc("foo") #=> nil
Ruby 哈希
哈希就是我们以往的key value组合的数据结构。
哈希的基本使用
words = Hash.new
words["hello"]='world'
puts words["hello"]
使用起来很简单,跟别的语言里面的数组没什么区别,跟php的array特像。
创建哈希有以下几种方式,不带默认值的哈希值的默认value是 nil,实测如下
words = Hash.new "aa"
puts "#{words['234423']}"
用算法来赋值的结构是
Hash.new { |hash, key| block }
我本来以为urby是根据我的算法来初始化key和value,那岂不是无限循环了?!但是后来发现ruby是把算法存起来,当你用key去取value的时候才去计算value
#简单创建一个哈希
simpleInit = Hash["a"=> 1, "b"=>2]
puts simpleInit["a"]
#用算法创建一个哈希
algo = Hash.new { |hash, key| hash[key] = key * 2 }
puts algo[6]
输出
$ ruby test.rb
1
12
哈希的相等
哈希的相等是比较键值对是否相符,而不是比较object_id#简单创建一个哈希
h1 = Hash[1=> 2, 2=>4]
#再创建一个哈希
h2 = Hash.new
h2[1]=2
h2[2]=4
#判断是否相等
puts h1==h2
清理哈希
从哈希中清除所有键值对有一个快捷方法clear
#创建一个哈希
h3 = Hash.new
h3[1]=2
h3[2]=4
#清理hash内的值
h3.clear
#尝试打印h3的值
puts h3[1]
删除哈希中的值
delete这个方法其实挺自解释的,但是我要说的是ruby还有一种根据算法去删除值的更厉害的方法delete_if
#创建一个哈希
h4 = Hash[1=>2,3=>4,5=>6]
h4.delete_if {|k,v| k==3}
puts h4
遍历哈希
一般都用each来遍历,还可以用 each_key, each_value 来遍历#创建一个哈希
h5 = Hash[1=>2,3=>4,5=>6]
h5.each{|k,v| puts "#{k}'s value is #{v}"}
#用each_key来遍历一次
h5.each_key {|k| puts h5[k]}
#用each_value来遍历一次
h5.each_value {|v| puts v}
排序
排序一直是一个老问题,在ruby中排序比较简单
people = {
'fred' => 23,
'joan' => 18,
'pete' => 54
}
res = people.sort_by { |name, age| age }
puts res
其实我们在实际工作中一般都是对比较复杂的哈希进行排序的,比如value是一整个hash,需要这样排序
people = {
:fred => { :name => "Fred", :age => 23 },
:joan => { :name => "Joan", :age => 18 },
:pete => { :name => "Pete", :age => 54 }
}
res = people.sort_by { |k, v| v[:age] }
puts res
当然还有更复杂的排序,如果是java的话,实现 Comparable就可以排序,无论多复杂的比较都可以完成,而在ruby中更复杂的就只能自己实现冒泡和插入等具体算法的实现了
Ruby日期和时间
获取时间有两种方法 Time.new 和 Time.now ,其实是一回事
time1 = Time.new
puts "Time1 : " + time1.inspect
time2 = Time.now
puts "Time2 : " + time2.inspect
时间的具体字段
time = Time.new
#打印具体的各个时间属性
puts time.year # => 日期的年份
puts time.month # => 日期的月份(1 到 12)
puts time.day # => 一个月中的第几天(1 到 31)
puts time.wday # => 一周中的星期几(0 是星期日)
puts time.yday # => 365:一年中的第几天
puts time.hour # => 23:24 小时制
puts time.min # => 59
puts time.sec # => 59
puts time.usec # => 999999:微秒
puts time.zone # => "UTC":时区名称
时区和夏令时
用Ruby来做夏令时实在太简单了,用isdst方法就搞定了time = Time.new
# 这里是解释
puts time.zone # => "UTC":返回时区
puts time.utc_offset # => 0:UTC 是相对于 UTC 的 0 秒偏移
puts time.zone # => "PST"(或其他时区)
puts time.isdst # => false:如果 UTC 没有 DST(夏令时)
puts time.utc? # => true:如果在 UTC 时区
puts time.localtime # 转换为本地时区
puts time.gmtime # 转换回 UTC
puts time.getlocal # 返回本地区中的一个新的 Time 对象
puts time.getutc # 返回 UTC 中的一个新的 Time 对象
时间格式化
做编程的都知道用时间对象一定会遇到格式化和反格式化的问题。在ruby中格式化这样做time = Time.new
puts time.strftime("%Y-%m-%d %H:%M:%S")
是不是简单到爆?
反格式化就麻烦多了,需要用到DateTime类,而且这个类需要手动加载 (虽然我不是很理解ruby为什么不把反格式化的方法做成一个简单的内置方法),不过好消息是这个类文件是内置的,并不用再去下载
require 'date'
time = DateTime.strptime('2001-02-03T04:05:06:07:00', '%Y-%m-%dT%H:%M:%S')
puts time
最后
以上就是心灵美薯片为你收集整理的有趣的Ruby-学习笔记5Ruby字符串Ruby数组Ruby 哈希Ruby日期和时间的全部内容,希望文章能够帮你解决有趣的Ruby-学习笔记5Ruby字符串Ruby数组Ruby 哈希Ruby日期和时间所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复