Ruby 使用#inject连接数组中的字符串
我正在经历,它通常有一个非常简单的单线解。问题表明,给定以下数组:Ruby 使用#inject连接数组中的字符串,ruby,arrays,string,inject,Ruby,Arrays,String,Inject,我正在经历,它通常有一个非常简单的单线解。问题表明,给定以下数组: ["emperor", "joshua", "abraham", "norton"] 我必须使用#inject将所有名称的单个字符串与一个字符串连接在一起,每个名称的首字母大写,如下所示: "Emperor Joshua Abraham Norton" ["emperor", "joshua", "abraham", "norton"].inject("") do |memo, word| memo <<
["emperor", "joshua", "abraham", "norton"]
我必须使用#inject
将所有名称的单个字符串与一个字符串连接在一起,每个名称的首字母大写,如下所示:
"Emperor Joshua Abraham Norton"
["emperor", "joshua", "abraham", "norton"].inject("") do |memo, word|
memo << word.capitalize << " "
end
虽然这可以通过#map
和#join
轻松完成,但此特定练习只需要使用#inject。我想出了这样的办法:
"Emperor Joshua Abraham Norton"
["emperor", "joshua", "abraham", "norton"].inject("") do |memo, word|
memo << word.capitalize << " "
end
其中字符串末尾的空格不能作为正确的解决方案传递
- 如果结尾没有空格,我如何实现这一点
- 这是使用
传递空字符串的正确方法吗#inject
- 我是否正确使用了
不要使用
,有更好的方法解决这个问题:#inject
你的首要目标应该始终是解决手头的问题。您可以使用["emperor", "joshua", "abraham", "norton"].map(&:capitalize).join(' ')
,但这并不是理想的解决方案,甚至不是清晰的解决方案。你有更好的时间去做,而不是试图找出如何欺骗#inject
#注入
,给你正确的结果。
a=[“皇帝”、“约书亚”、“亚伯拉罕”、“诺顿”]
a、 drop(1).注入(a.first.capitalize){res,m | res试试这个:a = ["emperor", "joshua", "abraham", "norton"] a.drop(1).inject(a.first.capitalize){|res,m| res << ' '+m.capitalize }
我不认为你可以通过注射来逃避额外的空间。你也需要这样做a.map{|t| t.capitalize}.join(" ")
编辑:由于该语句已更改为强制您不使用join和map,以下是inject的一个有点难看的解决方案:memo = memo + word.capitalize + " "
a.inject("") do |memo, world| memo << " " unless memo.empty? memo << word.capitalize end
a.inject(“”)do|memo,world|
备注有比
更好的方法,请参阅其他答案。但如果您坚持认为可以只使用#inject
尾随空格字符String#rstrip
或者,在添加字符之前,翻转块并检查备注是否为空memo << " " unless memo.empty? memo << name.capitalize
memo << " " unless memo.empty? memo << name.capitalize
memo检查以添加
每回合的费用都比“
最后一次输出。你关于chop!
的选择放了x.injection{memo,val}“{memo}{val.upcase}然而,我建议你马上问这个问题,看看人们会想到什么。问题表明,虽然它可以(也应该)问这个问题使用#map and#join可以轻松完成,它希望您使用#inject。此练习旨在让您了解这些方法的作用和工作原理。因此,请用一个有意义的问题来测试您的理解:例如“将1到100之间的所有数字相加,但减去可被5整除的数字”.很好,详细描述问题为初学者谢谢所有的答案!我知道在这种情况下使用#inject似乎很愚蠢,但这只是其中一个练习,旨在测试你对概念的理解,而不一定是你找到最短、最有效解决方案的能力。谢谢你的回答!我编辑了我的原始问题请澄清此练习需要使用#inject。它特别说明不要使用#map和#join。哦,这很有趣……谢谢!你能解释一下“+m”的用法吗。大写将返回“Joshua”,并增加初始值“皇帝”。操作的结果将是“皇帝Joshua”它将被传递到下一个迭代。关闭,但第一个元素被添加两次。代码结果为“皇帝约书亚·亚伯拉罕·诺顿”。如果在
。谢谢!练习中说我必须使用#inject提供解决方案,并且我不能使用#map and#join。我更新了我原来的问题,这样说。成功了!另一张海报使用了除非memo.empty?这也很有效。谢谢!我改进了我的答案,多亏了user1252434,所以我使用了除非和empty,使代码变得有点复杂更像红宝石。请再看一看更好地使用a[1..-1]上调用
,应该可以工作inject
@Marc AndréLafortune我不知道。谢谢你的洞察力。我将根据我的答案编辑。非常好,谢谢!我还有很多方法要学习。