2015-05-16 58 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

相关问题