试图覆盖to_s

时间:2015-01-06 18:19:17

标签: ruby

我是Ruby的新手,我不明白为什么我会得到我的结果。

  • 我有一个Person类,其中我有实例变量@name@age@weight。在这个类中,我重写要打印的to_s方法 对象的@name@age@weight
  • 我有一个House类,其中有一个类型为
    的对象数组 Person@persons),我也有一个名为person的方法 返回一个对象(在使用。指定的位置) 数组@persons中的参数号),例如any_house_object.person(0) 将返回Person对象上any_house_object类型的对象数组的第一个对象。

    class Person
        def initialize(name, age, weight)
            @name = name
            @age = age
            @weight = weight
        end
    
        def to_s
            puts "Name: #{@name}"
            puts "Age: #{@age}"
            puts "Weight: #{@weight}"
        end
    end
    
    class House
        def initialize
            @persons = []
        end
    
        def add_person(name, age, weight)
            @persons << Person.new(name, age, weight)
        end
    
        def person(number)
            @persons[number]
        end
    end
    
    my_house = House.new
    
    my_house.add_person("Patrick", "18", "65")
    my_house.add_person("John", "18", "65")
    
    puts my_house.person(0)
    

这个产品

    Name: Patrick
    Age: 18
    Wight: 65
    #<Person:0x5e2318>

最后,我的问题是我不明白为什么最后,当{I} puts my_house.person(0)最后也出现#<Person:0x5e2318>时。

1 个答案:

答案 0 :(得分:4)

to_s应该返回字符串,而不是将字符串输出到控制台。您的方法需要返回您正在构建的字符串:

def to_s
  "Name: #{@name}\nAge: #{@age}\nWeight: #{@weight}"
end

其次,to_s用于将对象转换为字符串。你实际上并没有在任何地方。只是调用puts <object>to_s没有任何关系。

如果要输出对象的字符串表示,则需要...

puts my_house.person(0).to_s

或者,您还需要定义自定义inspect方法,然后使用p <object>