将每个单词的第一个字母大写 - Ruby

时间:2014-01-26 08:16:55

标签: ruby

这是我的代码,我不确定为什么这不会返回预期的结果:A Bunny Hops

text= "a bunny hops"
final = text.split.each{|i| i.capitalize}.join(' ')
puts final

3 个答案:

答案 0 :(得分:11)

使用Array#map执行以下操作:

 text.split.map { |i| i.capitalize }.join(' ')

更正和短代码:

text= "a bunny hops"
final = text.split.map(&:capitalize).join(' ')
puts final
# >> A Bunny Hops

为什么没有你的工作:

因为Array#each方法返回已调用它的接收器本身:

text= "a bunny hops"
text.split.each(&:capitalize) # => ["a", "bunny", "hops"]

但是Array#map会返回一个新数组

text.split.map(&:capitalize) # => ["A", "Bunny", "Hops"]

我会使用String#gsub执行以下操作:

text= "a bunny hops"
text.gsub(/[A-Za-z']+/,&:capitalize) # => "A Bunny Hops"

注意:我在这里使用#gsub的模式并不是一件容易的事。我按照帖子本身给出的字符串做了。您需要根据您将拥有的文本字符串示例进行更改。但上面是用短代码和更多Rubyish方式做这些事情的方法。

答案 1 :(得分:2)

而不是将字符串拆分成数组,然后将它们重新连接在一起,只需使用正则表达式:

text = "a bunny hops"
final = text.gsub(/\b(?<!['’`])[a-z]/) { $&.capitalize }
puts final

完全披露,这是Ruby on Rails titleize方法的工作原理。 View Source.

答案 2 :(得分:1)

获取现有代码,只需添加!大写旁边:

final = text.split.each{|i| i.capitalize!}.join(' ')

或将'each'替换为'map':

final = text.split.map{|i| i.capitalize}.join(' ')

并且您的目标已经完成:)