Ruby: method to print and neat an array

Manza picture Manza · Apr 3, 2013 · Viewed 77.7k times · Source

I am not sure if this question is too silly but I haven't found a way to do it.

Usually to puts an array in a loop I do this

current_humans = [.....]
current_humans.each do |characteristic|
  puts characteristic
end

However if I have this:

class Human
  attr_accessor:name,:country,:sex
  @@current_humans = []

  def self.current_humans
    @@current_humans
  end

  def self.print    
    #@@current_humans.each do |characteristic|
    #  puts characteristic
    #end
    return @@current_humans.to_s    
  end

  def initialize(name='',country='',sex='')
    @name    = name
    @country = country
    @sex     = sex

    @@current_humans << self #everytime it is save or initialize it save all the data into an array
    puts "A new human has been instantiated"
  end       
end

jhon = Human.new('Jhon','American','M')
mary = Human.new('Mary','German','F')
puts Human.print

It doesn't work.

Of course I can use something like this

puts Human.current_humans.inspect

but I want to learn other alternatives!

Answer

Simone Carletti picture Simone Carletti · Apr 3, 2013

You can use the method p. Using p is actually equivalent of using puts + inspect on an object.

humans = %w( foo bar baz )

p humans
# => ["foo", "bar", "baz"]

puts humans.inspect
# => ["foo", "bar", "baz"]

But keep in mind p is more a debugging tool, it should not be used for printing records in the normal workflow.

There is also pp (pretty print), but you need to require it first.

require 'pp'

pp %w( foo bar baz )

pp works better with complex objects.


As a side note, don't use explicit return

def self.print  
  return @@current_humans.to_s    
end

should be

def self.print  
  @@current_humans.to_s    
end

And use 2-chars indentation, not 4.