2013-09-07 1 views
0

words.first.capitalizewords.join(" ")을 포함하는 줄의 순서를 반대로 할 때 titleize 방법에서 왜 nil이 발생합니까? 나는 words.first.capitalize 및 words.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 
+0

'nil'을 (를) 얻으려는 문자열을 알려주십시오. actula 대답은 숨겨져 있습니다. –

답변

2

는 왜 전무를받을 수 있나요?

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

String.capitalize!는 말한다 :

가 대문자로 첫 번째 문자와 소문자로 나머지를 변환하여 STR을 수정

는 이유입니다. 변경하지 않은 경우 nil을 반환합니다.. 참고 : 대/소문자 변환은 ASCII 영역에서만 유효합니다.

당신이 당신의 방법의 끝에 행 words.first.capitalize!를 가하고 있습니다

String.capitalize! 이미 대문자 단어를 대문자로했습니다. bang(!) 버전을 사용 중이므로 설명서에 따라 nil이 표시됩니다.

한 예 :

아마 당신의 입력 문자열을 테스트 할 때 당신이 여기 %w(the and of) 나열된 단어 중 하나를 포함하지 않는 한
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 

. 대신 String#capitalize을 사용하시기 바랍니다. 변경을 수행 한 경우

capitalize! 같은 장소에 문자열을 수정 string class
+0

영어로, 우리는': -'을 사용하지 않습니다. 문체적인 결정이 아니며 선행 공백없이':'만 사용하는 것은 적절한 구두점입니다. 또한 쉼표가없는 것처럼 문장의 쉼표 뒤에 공백이옵니다. –

+0

@theTinMan 그것을 고쳐 주셔서 감사합니다. 나는 영어로 그다지 좋지 않다! 내 제 3 언어입니다. –

2

방법, (그리고 gsub!, delete! 등) 만 문자열을 반환합니다. 어떤 수정이 이루어지지 않은 경우 그들은 nil를 반환 : 당신이 당신의 capitalize! 전화가 그렇게 할 때 (이것은 "은", "와"또는 "이상"로 시작하지 않는 한)

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

확률이 문자열이 이미 대문자로되어 있습니다 마지막으로 capitalize!과 문자열이 수정되지 않았으므로 메서드가 nil을 반환합니다.

관련 문제