Simmiah
Simmiah

Reputation: 43

Break in While Loop when Specific Input is Entered

I am trying to halt input from a user when their input is 42.

The correct answer on the website I'm working on is:

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

The code I tried that does not work is:

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

Why is this the case? Am I missing some limitations to what I can use in my if statement?

Upvotes: 1

Views: 1361

Answers (4)

user24359
user24359

Reputation:

The problem is that 42 is an integer, but line is a string:

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

So it's never the case that your if statement is getting triggered, because it's comparing two different kinds of things. Matching with a Regex fixes it, though it's looking for "42" to appear anywhere in the input (e.g. "3427"). I think what you meant to say was

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

In other words, break when the input is a string with the characters 4 and 2 in it.

Upvotes: 2

vgoff
vgoff

Reputation: 11313

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

This of course bypasses the if statement you were asking about.

Your limitation for the if is based solely on the fact that you are comparing a string that will always be a string to a number, and this will never be equal. (as others have mentioned)

So we must reconsider the conditional statement. In this case, I considered it "out of place" and moved the comparison to the 'while' loop, and then inverted it to an 'until' statement, to be able to positively express the condition to end the loop on. Whenever I see a 'break' in a loop, I try to get rid of that smell, as the condition to leave a loop should really be expressed in the loop condition if possible.

I hope this helps.

Upvotes: 0

Arup Rakshit
Arup Rakshit

Reputation: 118271

<< is a method(Append) on Array or String class objects. But your x not holding any referencing to such objects. Thus you are getting undefined local variable or method 'x' for main:Object (NameError).

Try this instead(by fixing local variable x to hold a practical object and converting line value to Fixnum object:

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

This program will help you to halt input from a user when their input is 42.

Upvotes: 0

Jeffrey Basurto
Jeffrey Basurto

Reputation: 1465

I suspect it's because you're comparing a number to a string. The example uses a regular expression it appears. "42" == 42 will give you false in ruby.

Upvotes: 0

Related Questions