类语句的奇怪输出

时间:2019-06-13 02:53:52

标签: ruby

我正在尝试将3个值放入数组的每个索引中。这些值是针对classassignmentgrade的。它们来自名为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 个答案:

答案 0 :(得分:3)

如果您希望能够-P类的一个实例,则需要为该类定义puts。现在,很可能使用默认的Grade_Log方法。

我认为您想要这样的东西:

to_s

与以下基本相同:

to_s

答案 1 :(得分:1)

实例化Grade_Log对象时,将调用initialize方法,并将参数分配给属性:

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

一种查看对象内容的快速方式是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_variablesObject.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