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 = ["emperor", "joshua", "abraham", "norton"]
    a.drop(1).inject(a.first.capitalize){|res,m| res << ' '+m.capitalize }
    
    a、 drop(1).注入(a.first.capitalize){res,m | res试试这个:

    a.map{|t| t.capitalize}.join(" ")
    
    我不认为你可以通过注射来逃避额外的空间。你也需要这样做

    memo = memo + word.capitalize + " " 
    
    编辑:由于该语句已更改为强制您不使用join和map,以下是inject的一个有点难看的解决方案:

    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”它将被传递到下一个迭代。关闭,但第一个元素被添加两次。代码结果为“皇帝约书亚·亚伯拉罕·诺顿”。如果在
    a[1..-1]上调用
    inject
    ,应该可以工作
    。谢谢!练习中说我必须使用#inject提供解决方案,并且我不能使用#map and#join。我更新了我原来的问题,这样说。成功了!另一张海报使用了除非memo.empty?这也很有效。谢谢!我改进了我的答案,多亏了user1252434,所以我使用了除非和empty,使代码变得有点复杂更像红宝石。请再看一看更好地使用
    @Marc AndréLafortune我不知道。谢谢你的洞察力。我将根据我的答案编辑。非常好,谢谢!我还有很多方法要学习。