初学Ruby 中关于 Map, Select,Collect 这些方法的使用

Python010

初学Ruby 中关于 Map, Select,Collect 这些方法的使用,第1张

map 和 select 可以说是ruby枚举方法中最重要也最有用的两个方法,如果你已经学习并了解Array和Hash,你一定会觉得他们非常漂亮和灵活,这只是ruby这个美女一半的风情而已......每个人都有自己习惯的添加、删除、访问数据的方法,也都有实现#each迭代的风格各异的版本,但是,你知道吗?使得Array和Hash在Ruby中真正强大的原因,是因为它们可以使用各种枚举(Enumerable)的方法,比如map和select。

"abcdefghijklmnopqrstuvwxyz".slice(9, 6)

找第10个字符开始的6个字符 也就是第10到第15个 索引从0开始 所以是9, 6

当然因为这是 ruby 所以我们还可以这么写

"abcdefghijklmnopqrstuvwxyz".slice 9, 6

另外我们还有带叹号版本的 slice 方法 它会返回被截取的部分 同时把原始字符串中被截取的部分删除

s = "abcdefghijklmnopqrstuvwxyz"

s.slice! 9, 6 # jklmno

p s # abcdefghipqrstuvwxyz

正如你所知道的,Ruby字符串被称为一流的对象,它使用了大量的查询和操作方法。一个最基本的字符串操作是把一个字符串分割成多个子字符串。如果你有一个字符串,如“foo, bar, baz”而你希望的是这样三个字符串“foo”,“bar”,“baz”。那么字符串类的split方法就可以帮助你。

“split”的基本用法

Split方法的最基本用法分裂一个由单独字符或字符的静态序列组成的字符串。如果split的第一个变量是一个字符串,那么这个字符串中字符就会被当作一个字符串分隔符使用。但是在逗号分隔的数据中,逗号用来分隔数据,这里的每个字符串成分都被用来分隔数据。

#!/usr/bin/env ruby

str = "foo,bar,baz"

puts str.split(",")

$ ./1.rbfoobarbaz通过正则表达式来增加灵活性

当然,还有一些更容易的方法可以分隔字符串。正则表达式可以为split方法增加灵活性。这里再次拿“foo, bar, baz”。间隔在第一个逗号之后而不是第二个逗号。如果该字符串“,”被当成是分隔符,那么在“baz”字符串的开始处仍然会存在间隔。如果使用“,”字符串,它只与第一个逗号匹配,因为第二个逗号后面没有间隔。其作用还是有限的。

解决这个问题的办法是把正则表达式作为定界符的自变量,而不是使用字符串。正则表达式不仅可以匹配静态序列的字符,对字符的不定量和可选字符都同样起作用。

编写正则表达式

为你的分隔符编写一个正则表达式,第一步就是描述清楚什么是分隔符。在这种情况下,一个逗号后面可能存在一个或多个空格是合理的。这一正则表达式库中存在两个要素:逗号和可选的间隔。间隔会使用* (星号)量词,它表示的意思是“零或更多”。任何在它之前的要素都会匹配零次或若干次。例如,正则表达式/ a * /将匹配序列零或更多“a”字符。

#!/usr/bin/env ruby

str = "foo, bar,baz"