操作要求是
将
"Ruby is an object oriented programming language"
每个单词的首字母变成大写。输出结果为"Ruby Is An Object Oriented Programming Language"
我第一遍写的是:
str = "Ruby is an object oriented programming language"
strd = ""
str.split.collect {|a| a[0]=a[0].upcase}.each{ |item|
strd += item + " "
}
p strd.strip
本意是希望 split 所返回数组中每个元素的第一个字符改为大写,但是其返回结果是:
"R I A O O P L"
即,每个元素直接被其首字母的大写字母完全覆盖了,没有达到预期的效果。于是我改为了下面这种写法,
str = "Ruby is an object oriented programming language"
strd = ""
str.split.collect {|a| a=a[0].upcase+a[1,a.length-1]}.each{ |item|
strd += item + " "
}
p strd.strip
返回结果正常:
"Ruby Is An Object Oriented Programming Language"
collect 方法会创建一个 Array 来接受 block 中的返回值,第一种方法返回的每个单词的首字母(即 a[0])
Ref: http://ruby-doc.org/core-2.2.0/Array.html#method-i-collect
(弱渣路过
str = "Ruby is an object oriented programming language"
strd = ""
str.split.collect {|a| a[0]=a[0].upcase; a}.each{ |item|
strd += item + " "
}
p strd.strip
小改就可以。collect 是以你的表达式为返回结果的,a[0] 当然就是一个字母了。
rails 有 API 可以使用,String#titleize
'man from the boondocks'.titleize # => "Man From The Boondocks"
'x-men: the last stand'.titleize # => "X Men: The Last Stand"
'TheManWithoutAPast'.titleize # => "The Man Without A Past"
'raiders_of_the_lost_ark'.titleize # => "Raiders Of The Lost Ark"
# File activesupport/lib/active_support/inflector/methods.rb, line 154
def titleize(word)
humanize(underscore(word)).gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
end
str[0] = str[0].upcase 复制之后返回的 str[0],所以才有此问题吧, 有点问题想问一下题主,比须要为了节省空间吗?ruby 一行代码可以搞定的,必要要这样用 c 的方式来写吗?
#20 楼 @geniousli 恩 5 楼的答案帮助我加深理解了 collect 的内部表达式。至于代码风格是因为初学 ruby,还停留在以前的习惯上,7 楼一句代码就搞定了也让我学习了很多。