我正在经历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
传递空字符串的正确方法吗?<<
来组合字符串?答案 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}”}