2013-05-09 1 views
1

Я пытаюсь остановить ввод от пользователя, когда их вклад 42.Перерыв в то время как петли, когда Конкретная Ввод Поступил

Правильный ответ на веб-сайте, я работаю на это:

while line = gets 
    break if (/42/ =~ line) 
    x << line 
end 

код я пытался что не работает это:

while line = gets.chomp 
    break if (line == 42) 
    x << line 
end 

Почему это так? У меня отсутствуют некоторые ограничения на то, что я могу использовать в своем заявлении if?

+0

Поскольку вы новичок, это не будет очень полезно, но обратите внимание, что Ruby - это язык, который может быть доступен с помощью декларативного кода. Я думаю, что что-то вроде этого довольно аккуратно: 'lines = repeat {gets} .take_while {| line | line.strip! = "42"} '(заполните пробелы для отсутствующих методов ;-)) – tokland

+0

Спасибо! Так очевидно и под носом. Я как-то предположил, что Руби волшебным образом узнает 42 как строку. – Simmiah

ответ

2

Проблема состоит в том, что 42 является целое число, но line является строкой:

1.9.3p392 :001 > "42" == 42 
=> false 

So никогда не бывает, чтобы ваш оператор if срабатывал, потому что он сравнивает два разных типа вещей. Соответствие с Regex исправляет его, хотя он ищет «42» для отображения в любом месте входа (например, «3427»). Я думаю, что ты хотел сказать

while line = gets.chomp 
    break if (line == "42") 
    x << line  
end 

Другими словами, перерыв, когда входной является строка с символами 4 и 2 в нем.

+0

Обратите внимание, что 'gets' возвращает возврат каретки. Может быть, 'line.chomp ==" 42 "'? – tokland

+0

@tokland У кода OP уже есть chomp, но я отредактировал свой ответ, чтобы включить полный блок кода, только для ясности. – 2013-05-09 20:15:28

0

<< - это метод (Append) на Array или String объекты класса. Но ваш x не содержит ссылок на такие объекты. Таким образом, вы получаете undefined local variable or method 'x' for main:Object (NameError).

Попробуйте вместо (фиксируя локальной переменной x провести практический объект и преобразования line значение Fixnum объекта:.

x = "hi" 
while line = gets.chomp 
    break if (line.to_i == 42) 
    x << line 
end 

Эта программа поможет вам to halt input from a user when their input is 42

0

Я подозреваю, что это потому, что вы сравниваете число с строкой. В этом примере используется регулярное выражение. «42» == 42 даст вам ложь в рубине.

0
until (line = gets.chomp).to_i == 42 
    x << line 
end 

Это, конечно, обходит заявление if, о котором вы спрашивали.

Ваше ограничение для if основано исключительно на том факте, что вы сравниваете строку, которая всегда будет строкой для числа, и это никогда не будет равным. (как указывали другие)

Поэтому мы должны пересмотреть условное утверждение. В этом случае я счел это «неуместным» и перенесло сравнение в цикл «while», а затем перевернул его в оператор «до», чтобы иметь возможность положительно выразить условие завершения цикла. Всякий раз, когда я вижу «разрыв» в цикле, я пытаюсь избавиться от этого запаха, так как условие оставить цикл должно быть действительно выражено в условии цикла, если это возможно.

Надеюсь, это поможет.