我是靠谱客的博主 心灵美薯片,最近开发中收集的这篇文章主要介绍有趣的Ruby-学习笔记5Ruby字符串Ruby数组Ruby 哈希Ruby日期和时间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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']}"

快速建立带值的哈希有2种方法,一种是直接把值写进去,一种是用某种算法来赋值。
用算法来赋值的结构是
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日期和时间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部