[ruby] Ruby基础(续)

131 阅读3分钟

正则表达式

Ruby中正则表达式的创建有2种方法:

  1. 通过Regexp.new方法
  2. 直接定义正则表达式常量,通过/.../

通常通过String#match方法将正则表达式应用于字符串。

zip_code = /\d{5}/
"no match".match(zip_code) 返回 nil,表示没有匹配
"Streen 90210".match(zip_code) 返回 #<MatchData "90210"> 表示找到匹配

也可以使用String#scan直接获得匹配后得到的内容数组,如:

zip_code = /\d{5}/
"Streen 90210".scan(zip_code) 返回 ["90210"]

String#split的行为与String#split (/\s+/)一样,针对空白字符(空格、制表符、回车)分割字符串,返回字符串数组。

哈希

又名关联数组。

通过{}定义空的哈希对象。也可定义时候直接提供键值对,如{"A"=>"a", "B"=>"b"}。

哈希的值可以是任何值,所以哈希可以嵌套,也就是哈希的值可以是另外一个哈希。

哈希遍历的语法:hash.each do |key, value| puts "key: #{key} value: #{value}" end

Symbol

以冒号开头。

通常用作哈希中的key,如{:name => "Michael", :email => "abc@email.com"}。用作哈希的key,查找时会比字符串更高效。Symbol一次比较即可,字符串需要逐个字符比较。

由于Symbol作为哈希的key很常见,Ruby提供了使用Symbol作为key创建哈希的快捷语法,如:a = {name: "Michael", email: "abc@email.com"}。访问时使用a[:name]即可返回"Michael"。

函数

函数定义遵循如下语法格式:

def function-name(arguments)
  // your code goes here
end

方法体中的并不需要显示的通过return返回结果,Ruby会将方法体内的最后一个表达式的结果作为函数的返回值。

Ruby支持函数的链式调用,如:"abc".chars.reverse.join返回"cba"。

Block

Block可以理解为匿名函数。

Ruby中有2种定义Block的方式:

  1. 通过{},如(1..5).each {|i| puts i}
  2. 通过do end,如 (1..5).each do |i| puts i end

通常,{}方式用于单表达式的block;do end既可以用于单表达式,多用于多行表达式的block。

任何Ruby方法都可以接受Block作为参数。

接受Block作为参数的方法内部,通过yield关键字触发Block的执行。

函数式编程

函数式编程大量使用Block。同时,作为一种新的编程范式,函数式编程强调不变性(immutability),着眼于对函数参数进行变换。

函数式编程常用的3个方法:map, select, reduce。

  1. map 将方法应用于数组中的每个元素,可作为循环的替代实现,如:[1,2,3].each { |e| e*e} 返回[1, 4, 9]
  2. select 选择数组中符合条件的元素,如:[1,2,3].select { |e| e <3} 返回[1, 2]
  3. reduce 对数组中的所有元素应用某些操作,最总简化为一个值,如:[1,2,3].reduce { |total, n| total + n} 返回 6。上述例子中,对数组内所有元素求和。

Enumerable

Ruby中的Enumerable模块提供诸多用于函数式编程的方法:

  1. collect 功能同map
  2. select 功能同find_all
  3. inject 功能同reduce
  4. detect 功能同find,找到符合条件的第一个元素即返回
  5. reject 返回数组中所有不符合条件的元素

函数式编程与TDD

函数式的实现通常很难拆分成具体的步骤,因此,通常结合TDD来保证实现的正确性。

Content mainly excerpted from 「Learn enough Ruby to be dangerous: write programs, pushlish gems and write Sinatra web apps with Ruby」 by Michael Hartl