为什么`join` un-capitalize数组中的字符串?

时间:2015-02-26 03:16:30

标签: ruby

我正在编写一个方法来大写字符串中的每个单词。不使用join方法,我可以获得正确的数组(例如david copperfield == ["David", "Copperfield"]):

def titleize(words)
  single_words = words.split(/ /)
  single_words.map {|i| i.capitalize}
  single_words.join(" ")
end

当我join元素时,它们会恢复为小写。我不知道为什么。任何帮助将不胜感激。

4 个答案:

答案 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