1

我认为我在正确的轨道上,但是当我尝试调用 p.first_name 时。我收到一个可以在屏幕截图中看到的错误,有人知道我做错了什么吗?

截图 http://snag.gy/pj6ny.jpg 如果看不到这里是链接: http: //snag.gy/pj6ny.jpg

这是代码:

class Person 

    def initialize (first_name, last_name, age)  
        @first_name = first_name  
        @last_name = last_name
        @age = age  

    end  
end

当我进入时一切都很好

> p = Person.new("Earl", "Rubens-Watts", 2)

但在那之后它变得很奇怪。期望的输出是:

 > p = Person.new("Earl", "Rubens-Watts", 2)
  > p.first_name
  => "Earl"
  > p.last_name
  => "Rubens-Watts"
  > p.age
  => 2

谢谢!

4

2 回答 2

6

您尚未定义first_name方法或声明任何属性。试试这个:

class Person 
    attr_reader :first_name, :last_name, :age
    def initialize (first_name, last_name, age)  
        @first_name = first_name  
        @last_name = last_name
        @age = age
    end
end
于 2012-06-15T04:00:55.353 回答
1

当您调用构造函数时,其值会作为实例变量new正确存储在对象中。p但是,如果您不编写读取它们的相关getter方法(OOP 中的常用方法),则无法从对象范围之外访问它们。

为此:

class Person

    attr_reader: :first_name, :last_name, :age

    def initialize (first_name, last_name, age)
        @first_name = first_name
        @last_name = last_name
        @age = age
    end

end

如果您还需要从外部修改它们的值,请attr_accessor改用它,它提供了自动gettersetter方法。

于 2012-06-15T04:09:22.957 回答