Подтвердить что ты не робот

Ruby: метод печати и аккуратного массива

Я не уверен, что этот вопрос слишком глуп, но я не нашел способ сделать это.

Обычно для размещения массива в цикле я делаю это

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

Однако, если у меня есть это:

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

Это не работает.

Конечно, я могу использовать что-то вроде этого

puts Human.current_humans.inspect

но я хочу узнать другие альтернативы!

4b9b3361

Ответ 1

Вы можете использовать метод p. Использование p фактически эквивалентно использованию puts + inspect для объекта.

humans = %w( foo bar baz )

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

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

Но имейте в виду, что p - это больше инструмент отладки, он не должен использоваться для печати записей в обычном рабочем процессе.

Существует также pp (довольно печатная версия), но вам нужно сначала его потребовать.

require 'pp'

pp %w( foo bar baz )

pp лучше работает со сложными объектами.


В качестве побочного примечания не используйте явный возврат

def self.print  
  return @@current_humans.to_s    
end

должен быть

def self.print  
  @@current_humans.to_s    
end

И используйте отступ 2-х символов, а не 4.