我正在编写一个方法来大写字符串中的每个单词。不使用join
方法,我可以获得正确的数组(例如david copperfield
== ["David", "Copperfield"]
):
def titleize(words)
single_words = words.split(/ /)
single_words.map {|i| i.capitalize}
single_words.join(" ")
end
当我join
元素时,它们会恢复为小写。我不知道为什么。任何帮助将不胜感激。
答案 0 :(得分:2)
使用map
的破坏性版本:map!
:
single_words.map! { |i| i.capitalize}
答案 1 :(得分:2)
您必须使用地图!而不是地图,因为地图会返回新数组,而不会更改初始数据。
def titleize(words)
single_words = words.split(/ /)
single_words.map! {|i| i.capitalize}
single_words.join(" ")
end
答案 2 :(得分:2)
join
不会将其取消资本化。您抛弃了大写的结果,并将原始的无资本化数组传递给join
。
如果你的意图是将/ /
分隔的每个子字符串大写,那么更正常和更好的方法是:
def titleize(words)
words.gsub(/[^ ]+/, &:capitalize)
end
我不太清楚为什么要使用数组。
答案 3 :(得分:1)
如果您转到Array#map
文档页面,您会发现它
为self的每个元素调用给定的块一次。
创建一个包含块返回值的新数组。
因此.map
会返回新数组,但不会修改您提供的数组。这就是你的方法工作的原因,当.map
是最后一条指令时。
要修复代码,您可以将.map
替换为.map!
,修改提供的数组(single_words
):
def titleize(words)
single_words = words.split(/ /)
single_words.map! {|i| i.capitalize}
single_words.join(" ")
end
或将.capitalize
替换为.capitalize!
,修改字符串:
def titleize(words)
single_words = words.split(/ /)
single_words.map {|i| i.capitalize!}
single_words.join(" ")
end
或在.join
之后立即执行.map
:
def titleize(words)
single_words = words.split(/ /)
single_words.map {|i| i.capitalize}.join(' ')
end
事实上,你的方法很简单,只需一行:
def titleize(string)
string.split.map(&:capitalize).join(' ')
end