2013-04-21 2 views
0

Я пытаюсь создать метод определения заголовка для назначения программирования, он заглаживает определенные слова и игнорирует другие. Он всегда заглаживает первое слово. С этой целью я создал метод, который находит первое слово строки и пытается вызвать его в методе titleize. Я получаю сообщение об ошибке «warning: string literal in condition». Я попытался изменить формулировку цикла if, но это не исправление моей ошибки. Может ли кто-нибудь объяснить мне, почему мой код нарушен? Большое спасибо за Вашу помощь!Методы вызова в методах для Titleize в 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

+1

Ваш код неправильно заглавной буквы слова, которое не совпадает с начальным словом. – sawa

+0

@sawa Вы правы! –

ответ

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 для «это не будет иметь большого смысла, и его очень трудно читать». Читаемость для этой условной конструкции очень плохая. Частично это «' и «или», что является законным, но оно * выглядит * как синтаксическая ошибка с первого взгляда. –

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 

Это произошло, как интерпретатор рубинового видит свой код, как показано ниже:

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

Второй всегда будет оцениваться t rue, потому что '12' всегда существует. Предупреждение говорит, что вместо boolean или test у вас есть строковый литерал, '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