#ruby #if-statement
#ruby #if-statement
Вопрос:
Я хочу, чтобы пользователь вводил что угодно, но это должно включать две строки, такие как «look» и «right», если обе включены в предложение, тогда программа перейдет к следующей строке. Я новичок в ruby, просто знакомлюсь с языком.
Я пробовал amp;amp;
и ||
, но это не работает
puts " in which direction do you want to look"
input = gets.chomp.to_s
if input.include? == "look" amp;amp; "right"
puts " There is a dead end on the right"
elsif input.include? "look" amp;amp; "left"
puts "there is a narrow way , going towards the woods"
else
puts "i dont understand what you are trying to say"
end
Комментарии:
1. Это совсем не так
include?
работает. Вот документы: Строка#включить? . Вот что вам нужно было написать:input.include?("look") amp;amp; input.include?("right")
2. Спасибо, чувак, действительно ценю твою помощь, попробую и дам тебе знать, работает ли это.
3. «это не работает» — недостаточно точное описание ошибки, чтобы мы могли вам помочь. Что не работает? Как это не работает? Какие проблемы у вас с вашим кодом? Вы получаете сообщение об ошибке? Что это за сообщение об ошибке? Результат, который вы получаете, не тот, который вы ожидаете? Какого результата вы ожидаете и почему, какой результат вы получаете и чем они отличаются? Поведение, которое вы наблюдаете, не является желаемым поведением? Каково желаемое поведение и почему, каково наблюдаемое поведение и чем они отличаются?
4. да, конечно, сделаю это
Ответ №1:
Вместо input.include? "look" amp;amp; "right"
вам нужно сравнить операторы один за другим.
if input.include?("look") amp;amp; input.include?("right")
puts " There is a dead end on the right"
elsif input.include?("look") amp;amp; input.include?("left")
puts "there is a narrow way , going towards the woods"
else
puts "i dont understand what you are trying to say"
end
Логически, input.include? "look"
это либо вернет true, либо false, и input.include? "right"
также вернет true или false. Для того, чтобы это сработало, оба оператора должны быть true!
Комментарии:
1. спасибо за помощь, действительно помогла мне понять .. теперь все работает нормально.
2. Рад помочь !! 🙂
Ответ №2:
Я бы предложил определить метод, который обрабатывает входные данные и возвращает direction
для использования в if/then/else
:
def get_direction(input)
keywords = ['look', 'left', 'right']
directions = {101 => :right, 110 => :left}
directions.default = :none
input = input.scan(/w /).map(amp;:downcase).uniq
key = keywords.map { |k| input.include? k }.map{ |e| e ? 1 : 0 }.join().to_i
directions[key]
end
Это несколько примеров вызовов методов:
get_direction("Yes. Look at your right now! Right now! Look!") #=> :right
get_direction("Yes. Look at your left now!") #=> :left
get_direction("Look right. Left them there!") #=> :none
get_direction("Stay right here!") #=> :none
Внутри метода вы можете найти строку#scan для разделения входных данных на слова. Кроме того, есть .map(amp;:downcase)
способ обеспечить нечувствительность к регистру, используя Array#map. Для выбора выходных данных используется хэш.
Добавьте p
, чтобы распечатать эту строку, чтобы понять, как она работает:
p key = keywords.map { |k| input.include? k }.map{ |e| e ? 1 : 0 }.join().to_i
Теперь вы можете использовать метод таким образом:
direction = get_direction(gets.chomp.to_s)
if direction == :right
p 'right'
elsif direction == :left
p 'left'
else
p 'none'
end
Комментарии:
1. о да, спасибо, я обязательно проверю этот set class , выглядит великолепно. Спасибо