11

我正在上一个在线课程,它通常有一个非常简单的单行解决方案。一个问题指出,给定以下数组:

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

我必须使用#inject一个字符串来获取所有名称的单个字符串,每个名称都以字符串开头,如下所示:

"Emperor Joshua Abraham Norton"

虽然这可以很容易地用#mapand完成#join,但这个特殊的练习只需要使用 #inject。我想出了这样的事情:

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

这会给我:

"Emperor Joshua Abraham Norton "

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

  • 我如何在最后没有空格的情况下实现这一点?
  • 这甚至是正确的使用方式#inject,传递一个空字符串吗?
  • 我是否正确使用了<<组合字符串?
4

6 回答 6

10

试试这个:

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

我不认为你可以通过注入来逃离额外的空间。你也需要做

memo = memo + word.capitalize + " " 

编辑:由于声明已更改为强制您不要使用 join 和 map,这里是一个有点丑陋的注入解决方案:

a.inject("") do |memo, world|
  memo << " " unless memo.empty?
  memo << word.capitalize
end
于 2012-03-14T13:32:50.593 回答
2
a = ["emperor", "joshua", "abraham", "norton"]
a.drop(1).inject(a.first.capitalize){|res,m| res << ' '+m.capitalize }
于 2012-03-14T13:26:14.343 回答
1

那么有更好的方法#inject,请参阅其他答案。但如果你坚持你可以只是String#rstrip尾随空格字符。

或者在添加字符之前将块翻转并检查备忘录是否为空。

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

我不确定<<运营商。我会使用+,但这可能只是个人喜好。

于 2012-03-14T13:35:18.050 回答
1

检查添加每一轮比最后一个输出" "更昂贵 。chop!你的选择<<是真的,你可以看看string concatenation

%w(emperor joshua abraham norton).inject("") do |m,w|
  m << w.capitalize << " "
end.chop!
"Emperor Joshua Abraham Norton"
于 2012-03-14T14:22:48.093 回答
0

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

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

您的首要目标应该始终是解决手头的问题。您可以使用#inject,但这不是理想的,甚至不是清晰的解决方案。你有更好的时间来处理你的时间,而不是试图弄清楚如何欺骗#inject给你正确的结果。

于 2012-03-14T13:25:37.387 回答
0

将 x.inject { |memo, val| "#{memo} #{val.upcase}" }

于 2015-08-12T10:25:13.683 回答