首字母大写
最后更新于:2022-04-01 10:49:31
## 问题
让一段字符串中每一个单词首字母大写。
## 方法
使用`split`、`map`、`join`模式:把字符串分割成一个个单词,然后把每个单词映射为首字母大且其他字母小写的新单词,最后使用`join`方法恢复成一个字符串。
~~~
("foo bar baz".split(' ').map (word) -> word[0].toUpperCase() + word[1..-1].toLowerCase()).join ' '
# => 'Foo Bar Baz'
~~~
或者,通过列表解析来实现:
~~~
(word[0].toUpperCase() + word[1..-1].toLowerCase() for word in "foo bar baz".split /\s+/).join ' '
# => 'Foo Bar Baz'
~~~
## 详解
Split,map和join是一种常用的脚本模式,可追溯到perl语言。使用[扩展类](http://island205.com/chapters/objects/extending-classes)把这些函数直接放到String类中会更好。
Split,map和join模式也有两点不足之处需要注意。一是,如果被分割的字符串比较固定的话split没什么问题,不过不过源字符串中包含多个空格,使用split方法就需要考虑进去,以免混入多余的空单词。使用正则表达式代替单个空格来对连续空格进行切分是一种方法:
~~~
("foo bar baz".split(/\s+/).map (word) -> word[0].toUpperCase() + word[1..-1].toLowerCase()).join ' '
# => 'Foo Bar Baz'
~~~
……但是这会把我们导向另一个瑕疵:注意,join后,连续的空格现在被精简成了单个空格。
然而,通常这两个瑕疵或多或少是可以接受的,因此,slipt,map和join模式是非常有用的工具。