Ruby 块“方法中的块”:true:TrueClass 的未定义方法“注入”(NoMethodError)

Ruby block `block in Method': undefined method `inject' for true:TrueClass (NoMethodError)

我有一个方法接受一个字符串和 returns 一个新的句子字符串,其中每个超过 4 个字符的单词都删除了所有元音。输出应该 return 修改后的句子字符串符合这些规范。

def abbreviate_sentence(sent)
  arr = []
  word = sent.split("")
  word.reject do |v|
       if word.length > 4
         arr << %w(a e i o u).any?.inject(v)
       else arr << word
       end
  end
  return arr
end

我收到以下错误并尝试将修改后的元素包含/"inject" 到一个新数组中,在该数组中加入上述所需的字符串。如果我删除 "inject" 我得到一个布尔值而不是修改后的字符串。

您收到此错误是因为您尝试调用 Enumerable#inject method on result of Enumerable#any?,它是 truefalse

其他一些小注意事项:

  • 调用 str.split('') 将 return 所有字符而不是单词的数组。

  • 要从修饰词数组中形成结果字符串,您可以使用 Array#join 方法


就我个人而言,我会通过以下方式解决此任务:

def abbreviate_sentence(sentence)
  words = sentence.split # By default this method splits by whitespace
  handled_words = words.map do |w|
    if w.length > 4
      w.tr!('aeiou', '') # This method deltes all the wovels from word
    end
    w # Handled word
  end
  handled_words.join(' ') # Ruby returnes last evaluated expression automatically
end

部分结果使用 irb:

abbreviate_sentence 'Hello there! General Kenobi' # => "Hll thr! Gnrl Knb"
abbreviate_sentence 'sample text' # => "smpl text"

有一件事我应该指出: 此方法不保留空格,因为使用 String#split

abbreviate_sentence "Example \n with some \t\t\t new strings \n and \t tabulations" # => "Exmpl with some new strngs and tbltns"