0

メソッドで、andtitleizeを含む行の順序を逆にすると nil になるのはなぜですか?words.first.capitalizewords.join(" ")

def titleize(x)
words = x.split(" ").collect do |word|
    if %w(the and over).include?(word)
        word
    else 
        word.capitalize
    end
end 

words.first.capitalize!
words.join(" ")
end
4

2 に答える 2

2

words.first.capitalize と words.join(" ") 行の順序を逆にすると nil になるのはなぜですか?

これがまさにその理由だ:

"abb".capitalize # => "Abb"
"Abb".capitalize! # => nil
"Abb".capitalize # => "Abb"

String.capitalize!言います:

最初の文字を大文字に、残りを小文字に変換して str を変更します。変更がない場合は nil を返します。注: 大文字と小文字の変換は ASCII 領域でのみ有効です。

words.first.capitalize!メソッドの最後に行を配置するときに、String.capitalize!すでに大文字になっている単語を大文字にしようとしました。バージョンを使用しているbang(!)ため、ドキュメントに従って、nil.

一例:

def titleize(x)
  words = x.split(" ").collect do |word|
      if %w(the and of).include?(word)
          word
      else 
          word.capitalize
      end
  end 

  words.join(" ")
  words.first.capitalize!
end

titleize("he great book") # => nil

おそらく、テスト中に入力文字列に、ここ%w(the and of)にリストした単語が含まれていなかった可能性があります。代わりに使用することをお勧めしますString#capitalize

于 2013-09-07T21:04:26.503 に答える
2

(および、など)のように、文字列をその場で変更する文字列クラスのメソッドは、変更が加えられた場合にのみ文字列を返します。変更が行われていない場合、次を返します。capitalize!gsub!delete!nil

irb(main):007:0> "the".capitalize!
=> "The"
irb(main):008:0> "The".capitalize!
=> nil

文字列が既に大文字になっている可能性があります (「the」、「and」、または「over」で始まる場合を除く)。そのため、capitalize!最後に呼び出しを行うと、文字列が変更されていないため、capitalize!メソッドとメソッドの両方が返されます。nil

于 2013-09-07T21:22:38.627 に答える