2013-04-21 52 views
0

我想爲編程任務創建一個標題化方法,它將大寫某些單詞並忽略其他單詞。它總是首字母大寫。爲此,我創建了一個方法來查找字符串的第一個單詞,並試圖在titleize方法中調用它。我得到一個錯誤,說「警告:條件字符串文字」。我試着改變周圍的if循環的語句,但它並沒有解決我的錯誤。任何人都可以解釋爲什麼我的代碼被破壞?非常感謝你的幫助!在Ruby中標題化的方法中調用方法

def first_word(str) 
    array = str.split(' ') 
    return array[0] 
end 

def titleize(str) 
    words = str.split 
    words.each do |word| 
     if word != first_word(str) 
      word.capitalize! 
     elsif word != 'and' or 'the' 
      word.capitalize! 
     end 
     words.join ' ' 
    end 
end 
+2

順便說一句:你的代碼是低效的。考慮一個很長的字符串與許多單詞分裂它消耗時間和內存。在'words.each'循環的每個循環中,您都會調用'first_word()',它再次分割整個字符串。最好先做'first_word = words.first',然後在循環中使用'first_word'變量。 – tessi 2013-04-21 09:06:48

+1

您的代碼錯誤地將與初始單詞相同的非初始單詞大寫。 – sawa 2013-04-21 09:39:55

+0

@sawa你是對的! – 2013-04-21 09:45:17

回答

1

更改以下

elsif word != 'and' or 'the' 

elsif word != 'and' or word != 'the' 
1

操作!=or更高的優先級。這意味着,這條線

elsif word != 'and' or 'the' 

相當於

elsif (word != 'and') or 'the' 

,而不是

elsif word != ('and' or 'the') 

因爲你可能預期。後者等價應表示爲

elsif word != 'and' or word != 'the' 

但即使在這種情況下,它不會使一個很大的意義,這是非常難以閱讀。

您可能希望將鏈接改爲

elsif !%w(and the).include?(word) 
+0

+1,因爲「它不會很有意義,而且很難閱讀」。該條件構造的可讀性非常差。其中一部分是「'」和「or'」,這是合法的,但它*看起來像乍一看語法錯誤。 – 2013-04-21 10:52:11

1
str = 'abc' 
p "hi" if str == '1' or '12' 
#=> warning: string literal in condition 

str = 'abc' 
p "hi" if (str == '1' or '12') 
#=> warning: string literal in condition 
p "hi" if '12' 
#=> warning: string literal in condition 

這件事發生的Ruby解釋器看到你的代碼如下:

p "hi" if str == '1' or true 

第二總是會評估爲t rue,因爲'12'總是存在。警告是說,而不是booleantest,您有一個字符串文字,'12',其始終計算爲true

所以一個解決方法是如下:

p "hi" if str == '1' or str == '12' #=> "hi" 
p "hi" if ['1','12'].include? str #=> "hi" 
0

不知道如何讀這個。但它很短!

def titleize(str) 
    str.capitalize.split.map do |word| 
    %w{and the}.include?(word.downcase) ? word : word.capitalize 
    end.join(' ') 
end