Странный вывод из выражения класса - PullRequest
2 голосов
/ 13 июня 2019

Я пытаюсь поместить 3 значения в каждый индекс массива. Значения приведены для class, assignment и grade. Они происходят от объекта класса с именем Grade_Log.

У меня проблема с выводом.

class Grade_Log
  attr_accessor :which_class, :assignment_type, :grade
  def initialize(which_class, assignment_type, grade)
    @which_class = which_class
    @assignment_type = assignment_type
    @grade = grade
  end
end

#values are assigned to add_class, add_assignment, and add_grade

  grade_index[grade_index_tally] = Grade_Log.new(add_class,add_assignment,add_grade)

  puts grade_index[grade_index_tally]

Я бы хотел, чтобы он вывел, например, "PHYSICS, HOMEWORK, 95", но вместо этого я получаю следующее. #<Grade_Log:0x0000000002baaa20>

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

Если вы хотите иметь возможность puts экземпляра вашего Grade_Log класса, вам нужно определить to_s для вашего класса.Прямо сейчас он, вероятно, использует метод to_s по умолчанию.

Я думаю, вы хотели бы что-то вроде этого:

class Grade_Log
  ... # your code 

  def to_s
    "#{which_class}, #{assignment_type}, #{grade}"
  end
end

Что в основном то же самое, что и:

def to_s
  [which_class, assignment_type, grade].join(', ')
end
1 голос
/ 13 июня 2019

Когда вы создаете экземпляр объекта Grade_Log, вызывается метод инициализации и параметры присваиваются атрибутам:

tmp = GradeLog.new("PHYSICS", "HOMEWORK", 95)


Если вы просто puts переменную, вы получаете информацию об объекте:
puts tmp #=> #<Grade_Log:0x007fc27213f3a8>

Чтобы получить доступ к атрибутам, вы должны сделать

puts tmp.which_class #=> PHYSICS
puts tmp.assignment_type #=> HOMEWORK
puts tmp.grade #=> 95

A быстрый способ просмотра содержимого объекта это метод inspect:

puts tmp.inspect #=> #<Grade_Log:0x007fd7e6917358 @which_class="PHYSICS", @assignment_type="HOMEWORK", @grade=95>

, что аналогично использованию Kernel # p :

p tmp #=> #<Grade_Log:0x007fd7e6917358 @which_class="PHYSICS", @assignment_type="HOMEWORK", @grade=95>


Другой вариант - получить доступ к переменным экземпляра , Object.html # instance_variables и Object.html # instance_variable_get :
tmp.instance_variables.map { |v| tmp.instance_variable_get(v) } #=> ["PHYSICS", "HOMEWORK", 95]

Или определить собственный метод внутри вашего класса, чтобы получить массив значений, например(нет необходимости редактировать метод при добавлении нового атрибута):

def attributes_values
  instance_variables.map { |v| instance_variable_get(v) }
end

Таким образом, вы можете вызвать просто

tmp.attributes_values #=> ["PHYSICS", "HOMEWORK", 95]


Наконец, если вы хотите формат вывод в виде строки Вы можете определить метод to_s для переопределения метода Object # to_s по умолчанию, чтобыЗвоните puts tmp.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...