What am i doing wrong?

I realize this is an extremely noobish question, but i’m stuck and can’t
seem to figure it out (aside from some very simple HTML, i know nothing
about programming).

I’m trying to follow Chris P. guide here:
http://pine.fm/LearnToProgram/?Chapter=04

I’m trying this question he suggested:
• Write a program which asks for a person’s favorite number. Have your
program add one to the number, then suggest the result as a bigger and
better favorite number. (Do be tactful about it, though.)

This is what i have, but it’s not working:

puts ‘What is your favorite number?’
number = gets
puts ‘That is a good number, but ’ + (number.to_i + 1) + ’ is better!’

However, if i remove the (number.to_i + 1) from that line, it prints out
the text just fine. And if i remove the text, so the line is only:

puts number.to_i + 1

I get the correct results. But if i try to combine the two, i get:
TypeError: cannot convert Fixnum into String

method + in untitled document at line 3
at top level in untitled document at line 3

I’m using Textmate if that matters.

Nick,

number = gets

after this line, try to

p number

to see what does it contain. It contains

“4\n”

So, there is an ugly “\n” (carriage return) at the end. Let’s remove
that!

number = gets.chop
p number

now we have

“4”

That’s better.
However, this was not the problem, your program will run also without
this fix :slight_smile: The problem is that

(number.to_i + 1)

is a FixNum - you need to turn that into a String. So the correct
solution reads:

‘That is a good number, but ’ + (number.to_i + 1).to_s + ’ is better!’

HTH,
Peter

__
http://www.rubyrailways.com

(number.to_i + 1).to_s

You’re trying to merge a String and a Fixnum into one object (i.e.,
you feed one big string obect to puts; you can’t merge a Fixnum and
String like that). The to_s method will convert the Fixnum you
created with to_i and added one to back to a string for output.

Kind of confusing I know, but if you got this far, I’m sure youll get
it. :slight_smile:

–Jeremy

On 1/21/07, Nick N. [email protected] wrote:

better favorite number. (Do be tactful about it, though.)
puts number.to_i + 1
Posted via http://www.ruby-forum.com/.


My free Ruby e-book:
http://www.humblelittlerubybook.com/book/

My blogs:

http://www.rubyinpractice.com/

Another alternative:

puts “What’s your favourite number?”
number= gets.to_i
puts “Hmm… not bad, but #{number+1} is better”

Thank you very much! That does make sense now!

Nick N. wrote:

better favorite number. (Do be tactful about it, though.)
puts number.to_i + 1

I get the correct results. But if i try to combine the two, i get:
TypeError: cannot convert Fixnum into String

printf “That is good, but %d is better.\n”, number.to_i+1

print "What’s your favorite number? "
puts “Good one, but #{gets.to_i + 1} is better”

Nice (I didn’t realise you could do that either).
How about with error checking:

print "What’s your favorite number? "
puts “Good one, but #{Float(gets)+1} is better” rescue puts “That’s
not a number!”

Sharon P. wrote the following on 21.01.2007 08:16 :

Another alternative:

puts “What’s your favourite number?”
number= gets.to_i
puts “Hmm… not bad, but #{number+1} is better”

Just realised this one works:

print "What’s your favorite number? "
puts “Good one, but #{gets.to_i + 1} is better”

On Jan 21, 2007, at 12:48 AM, Peter S. wrote:

“4\n”

So, there is an ugly “\n” (carriage return) at the end. Let’s
remove that!

number = gets.chop
p number

When you want to remove a line ending, prefer chomp() to chop().
chomp() will only target the line ending, which will cause you less
trouble when using it on a line that doesn’t actually have one:

“James”.chomp
=> “James”

“James”.chop
=> “Jame”

Finally, neither is needed in this case:

“42\n”.chomp.to_i == “42\n”.to_i
=> true

James Edward G. II