2013-10-02 2 views
0

В настоящее время я выполняю учебник rspec Test First и задаю вопрос, связанный с проблемой Pig_Latin.Ruby: String Ranges in a Pig Переводчик латинского языка

В частности, я хочу знать о диапазонах строк. Вот часть моего кода:

if phonemes.include?(word[0]) && phonemes.include?(word[1]) && phonemes.include?(word[2]) 
<do something> 
end 

Вместо выше я попытался:

if phonemes.include?(word[0..2]) # i added that character to the list of phonemes 
    <do something>     # e.g. if the word is school i added "sch" to 
end        # the array called phonemes 

Однако это не работает, даже "sch" в phonemes и word[0..2] == "sch"

Мой вопрос почему не могу ли я использовать диапазоны строк для управления результатом. (Я отправлю свой полный код в нижней части в случае, если это неясно)

кода (работа в процессе):

def translate(string) 
array = string.split(" ") 
alphabet = ("a".."z").to_a 
vowels = ["a", "e", "i", "o", "u"] 
phonemes = alphabet - vowels 
phonemes << ["qu", "sch", "thr"] 
result = [] 
array.each do |word| 
    if vowels.include?(word[0]) 
     result << (word + "ay") 
    elsif phonemes.include?(word[0..1]) 
     result << "do something" 
    elsif phonemes.include?(word[0]) && phonemes.include?(word[1]) && phonemes.include?(word[2]) 
     result << (word[3..-1] + (word[0..2] + "ay")) 
    elsif phonemes.include?(word[0]) && phonemes.include?(word[1]) 
     result << (word[2..-1] + (word[0..1] + "ay")) 
    elsif phonemes.include?(word[0..1]) 
     result << "do something else" 
    elsif phonemes.include?(word[0]) 
     result << (word[1..-1] + (word[0]+ "ay")) 
    end 
end 
return result.join(" ") 
end 

Как всегда советы, чтобы сделать код более эффективным было бы оценено (но наиболее для меня важно понять, почему строки строк не работают). Спасибо.

ответ

1

Ваше заявление phonemes << ["qu", "sch", "thr"] добавляет этот массив как последний элемент phonemes, поэтому include? не работает. Оператор << предназначен для добавления отдельных элементов в массив. Если вы хотите добавить все элементы этого массива в phonemes, вы можете использовать оператор +=.

+0

Удивительный! Это отлично, спасибо вам большое! –

1

Это не ответ на ваш главный вопрос, но вы попросили совета улучшить код. Я предлагаю вам рассмотреть использование case-case, в котором у вас есть длинный if-else. Это делает его более читаемым и уменьшает дублирование. Что-то вроде этого:

result << case 
    when vowels.include?(word[0]) 
    word + "ay" 
    when phonemes.include?(word[0..1]) 
    "do something" 
    when phonemes.include?(word[0]) && phonemes.include?(word[1]) 
    if phonemes.include?(word[2]) 
     word[3..-1] + word[0..2] + "ay" 
    else 
     word[2..-1] + word[0..1] + "ay" 
    end 
    when phonemes.include?(word[0..1]) 
    "do something else" 
    when phonemes.include?(word[0]) 
    word[1..-1] + word[0]+ "ay" 
    else 
    "do something else or raise an error if you reach this point." 
end 

Я не смотрел на свой код внимательно, но я заметил, что у вас есть phonemes.include?(word[0..1]) два раза, так что второй один никогда не будет выполнена.

+0

haha ​​yea Я видел это. Я переписывал его так много и сохранял старые копии, которые меня путают. Я только что закончил проблему (на самом деле не смотрел ее эффективность, потому что я только что закончил), но я очистил это. Большое спасибо за ответ, я буду смотреть на те, когда высказывания. Для уточнения, в чем разница между 'when' и' if', а также что такое 'result << case'. более конкретно, что такое 'case' –

+1

@Sai' when' - это ключевое слово, используемое с оператором 'case'. 'case' возвращает значение, в зависимости от того, к чему применяется' when'. Здесь 'case' возвращает значение, которое должно быть добавлено к' result', как это было в вашем коде. Проверьте документы для случая. –

+0

ОК благодарю вас за разъяснения –

Смежные вопросы