2015-05-16 60 views
0

所以很明顯這個問題之前已經被問過了,但是我真正要求的是特定於我寫的代碼。基本上我正在大寫字(標題)。我的方法沒有優化,而且它確實進入了圈子,所以只是忍耐。一旦我再次降低標題,我似乎無法重新評估標題的第一個字。我已經在代碼中寫下了評論,所以你可以在不分析整個事物的情況下輕鬆通過它。我不要求你寫一個新的代碼,因爲我可以只是谷歌。我更感興趣的是,爲什麼我的解決方案不工作..重新大寫第一個單詞

input: "the hamster and the mouse" 
output: "the Hamster and the Mouse" 
WHAT I WANT: "The Hamster and the Mouse" 


class String 
    def titleize 
    #regex reads: either beginning of string or whitespace followed by alpha 
    self.gsub(/(\A|\s)[a-z]/) do |letter| 
     letter.upcase! 
    end 
    end 
end 

class Book 
    attr_accessor :title 

    def title=(title) 
    @title = title.titleize #makes every word capitalized 

    small_words = %w[In The And A An Of] 
    words = @title.split(" ") 

    #makes all the "small_words" uncapitalized again 

    words.each do |word| 
     if small_words.include?(word) 
     word.downcase! 
     end 
    end 

    words[0][0].upcase! #doesnt work 
    @title = words.join(" ") 

    #NEED TO MAKE FIRST WORD CAPITALIZED EVEN IF ITS A "small_word" 
    @title[0].upcase! #also doesnt work 

    end 

+1

words [0] [0]正在返回數組中第一個單詞的第一個字母,但是是upcase!僅影響從單詞[0] [0]返回的值 - 它不會更改單詞[0]。嘗試單詞[0] [0] =單詞[0] [0] .upcase。字[0] .upcase!會改變單詞,但會改變單詞[0] [0] .upcase!纔不是。 – Joseph

+0

我可以發誓我試過這個,但這種方法工作!我認爲我之前做的是詞[0] [0] =詞[0] [0] .upcase !.我猜!是問題。我不需要打電話!如果我沒有改變它的位置嗎? – Jeff

+0

使用這種方法,如果您使用!或不,但沒有必要。因爲您正在重新賦值(單詞[0] [0]到單詞[0] [0] .upcase)。單詞[0]和單詞[0] [0]之間的區別在於單詞[0]引用了恰好是字符串的數組元素,因此可以用upcase!來更改。字[0] [0]引用一個字符串,但它不是單詞中的數組元素。字[0]正在調用數組的索引,該數組返回一個字符串。字[0] [0]正在調用字符串的索引並返回一個與數組元素無關的新字符串。 – Joseph

回答

1

更換words[0][0].upcase!words[0] = words[0].titleize。這將標題標題中的第一個單詞,這是你想要的。你也不需要@title[0].upcase!

0

更改從最後一行:

@title[0].upcase! 

要:

@title.capitalize! 

編輯: 我重寫了類。較少的行,你不需要RegEx或String#titleize方法。

class Book 
    attr_reader :title 

    def title=(title) 
     small_words = ["in", "the", "and", "a", "an", "of"] 

     @title = title.split.each do |word| 
      small_words.include?(word.downcase) ? word.downcase! : word.capitalize! 
     end 

     @title[0].capitalize! 
     @title = @title.join(" ") 
    end 
end 

new_book = Book.new 
new_book.title="the hamster and the mouse" 
new_book.title # => "The Hamster and the Mouse" 
+0

我不認爲這種方法會起作用。如果我再次利用這個稱號,那不就是將我剛剛寫成的小寫字母重新用大寫嗎? – Jeff

+0

沒有。它不會重新注入所有單詞。 [capitalize](http://ruby-doc.org/core-2.2.0/String.html#method-i-capitalize)方法僅將第一個單詞的首字母大寫。無論如何,我編輯了一個完全不同的解決方案,顯着減少了代碼行。它更短,它會返回你想要的結果 –

+0

對不起,我對此很新。不讀者只允許您閱讀標題?您需要訪問者才能夠.capitalize!或加入它,不是嗎? – Jeff

相關問題