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

字符串类上修改字符串的方法,如capitalize!(and 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 回答
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 回答