From: Stefano Crocco Date: 2008-06-15T04:12:33+09:00 Subject: Re: Definning "to_s" in a class - inexpected result On Saturday 14 June 2008, Andrés Suárez wrote: > Hi, > > I'm trying to obtain the cards of a Deck in a string like > "2s...KsAs2h...Ah2d...Ad2c...Ac". The problem with the folowing code is > that in the end of the string appears "#". Why? Can I > avoid it? > > class Deck > > SUITS = %w{s d h c} > RANKS = %w{2 3 4 5 6 7 8 9 T J Q K A} > > def initialize > @cards = [] > SUITS.each{ |s| RANKS.each{ |r| @cards << r+s } } > end > > def popCard > @cards.pop > end > > def to_s > @cards.map{ |card| print card} > end > > end > > d0 = Deck.new > puts d0 > > > Regards, > Andrés There are two problems with your code. The first is the use of print in the to_s method. print displays its arguments on screen and returns nil. So, the return value of the @cards.map expression is an array filled with nil elements. The second problem lies in the fact that your to_s method returns an array. You can solve both problems using the following definition of Deck#to_s: def to_s @cards.join ' ' end Since the elements of the @cards array are already strings, you don't need to convert them. Instead, you have to convert the array itself to a string: using join will convert each element of the array to a string, then concatenates them inserting a space between each pair. I hope this helps Stefano