我觉得这对于我对Ruby和面向对象编程的总体理解是至关重要的,所以我在这里提出这个相当简单的问题,冒着看起来很愚蠢的风险。我一直在玩弄irb。我创造了我的第一堂课:
$ irb
ruby-1.9.2-p290 :001 > class Person
ruby-1.9.2-p290 :002?> attr_accessor :firstname, :lastname, :gender
ruby-1.9.2-p290 :003?> end
=> nil
ruby-1.9.2-p290 :004 > person_instance = Person.new
=> #<Person:0x007f9b7a9a0f70>
ruby-1.9.2-p290 :005 > person_instance.firstname = "Bob"
=> "Bob"
ruby-1.9.2-p290 :006 > person_instance.lastname = "Dylan"
=> "Dylan"
ruby-1.9.2-p290 :007 > person_instance.gender = "male"
=> "male"
所以Person.new
是我的对象,对吗?或者我的对象是class Person
和我为该类定义的属性的组合吗?
答案 0 :(得分:6)
您的对象是运行Person.new
的结果,您已在person_instance
中捕获该内容。
在ruby中,属性在第一次写入之前实际上并不存在,因此在person_instance.firstname = "Bob"
之前,您的实例没有属性。执行此语句后,它具有@firstname
属性,但没有其他属性。
答案 1 :(得分:0)
你是对的。红宝石中的一切都是一个对象。因此,当您创建一个新类'person'时,它本身就是类类的对象。
答案 2 :(得分:0)
字符串也是对象,所以在你完成之后
person_instance.firstname = "Bob"
然后person_instance.firstname
引用一个字符串对象。所以你可以打电话给
# Returns String, indicating that the object returned by
# person_instance.firstname is an instance of the String class.
person_instance.firstname.class
# Returns a not very informative number, but indicates that it is its own object
person_instance.firstname.object_id