簡體   English   中英

更改兩行的順序后,為什么我得到零?

[英]Why do I get a nil after changing the order of two lines?

titleize方法中,當我反轉包含words.first.capitalizewords.join(" ")的行的順序時,為什么沒有nil?

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

當我反轉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

字符串類上用於修改字符串的方法,例如capitalize! (和gsub!delete!等),僅在對其進行更改后才返回該字符串。 如果未進行任何修改,則它們返回nil

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

很有可能您的字符串已經大寫(除非它以“ the”,“ and”或“ over”開頭),所以當您capitalize! 最后調用,都capitalize! 並且您的方法返回nil因為未修改字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM