使用#inject连接数组中的字符串

时间:2012-03-14 13:17:49

标签: ruby arrays string inject

我正在经历an online lesson,这通常有一个非常简单的单行解决方案。一个问题表明,给定以下数组:

["emperor", "joshua", "abraham", "norton"]

我必须使用#inject来获取一个用字符串连接在一起的所有名称的字符串,每个名称的初始上限,如下所示:

"Emperor Joshua Abraham Norton"

虽然可以使用#map#join轻松完成此操作,但此特定练习只需要使用#inject。我想出了类似的东西:

["emperor", "joshua", "abraham", "norton"].inject("") do |memo, word|
   memo << word.capitalize << " "
end

会给我:

"Emperor Joshua Abraham Norton "

其中字符串末尾的空格不作为正确的解决方案传递。

  • 如何在没有空白的情况下实现这一目标?
  • 这是使用#inject传递空字符串的正确方法吗?
  • 我是否正确使用<<来组合字符串?

6 个答案:

答案 0 :(得分:8)

试试这个:

a.map{|t| t.capitalize}.join(" ")

我不认为你可以通过注射逃脱额外的空间。你还需要做

memo = memo + word.capitalize + " " 

编辑:由于声明已经改为强制你不使用连接和地图,这里有一个有点丑陋的注入解决方案:

a.inject("") do |memo, world|
  memo << " " unless memo.empty?
  memo << word.capitalize
end

答案 1 :(得分:2)

a = ["emperor", "joshua", "abraham", "norton"]
a.drop(1).inject(a.first.capitalize){|res,m| res << ' '+m.capitalize }

答案 2 :(得分:1)

有更好的方式#inject,请参阅其他答案。但如果你坚持认为你只能String#rstrip尾随空格字符。

或者在添加角色之前转动块并检查备忘录是否为空。

memo << " " unless memo.empty?
memo << name.capitalize

我不确定<<运算符。我会使用+,但这可能仅仅是个人偏好。

答案 3 :(得分:1)

每回合检查添加" "的费用要高于 chop!最后一次输出。您对<<的选择是正确的,您可以查看string concatenation

irb(main):021:0> %w(emperor joshua abraham norton).inject("") do |m,w|
                     m << w.capitalize << " "
                   end.chop!
"Emperor Joshua Abraham Norton"

答案 4 :(得分:0)

不要使用#inject,有更好的方法可以解决这个问题:

["emperor", "joshua", "abraham", "norton"].map(&:capitalize).join(' ')

你的第一个目标应该始终是解决手头的问题。您可以使用#inject,但这不是理想的,甚至是明确的解决方案。你有更好的与时间有关的事情,而不是试图弄清楚#inject如何让你得到正确的结果。

答案 5 :(得分:0)

放x.inject {| memo,val | “#{memo}#{val.upcase}”}