Концепция открытого класса в Ruby - PullRequest
0 голосов
/ 17 февраля 2012

Я пытаюсь создать ряд объектов из класса.

class Class
    def initialize (name=nil, age = nil, weight = nil)
        @name = name
        @age = age
        @weight = weight
    end
end
p1 = Class.new("Joe", 12, 135)
p2 = Class.new("Jack", 29, 200)

Проблема в том, что объекты не будут содержать одинаковое количество параметров.Если я попытаюсь создать человека, у которого «нет» веса:

p3 = Class.new("Jill", 44)

Это повлияет на ранее созданные объекты, также удалив их вес, что я не собирался делать.Есть ли способ обойти это, закрытие классов?Или я что-то упускаю из жизни?

Ответы [ 3 ]

4 голосов
/ 17 февраля 2012

Не называйте свой класс «Класс»;каждый класс является экземпляром класса Class.

2 голосов
/ 17 февраля 2012

Вы пытаетесь переопределить Class, вы не можете этого сделать. Это уже существует. Class, который вы определяете, не является вашей версией. Это уже существующий. Вы можете проверить это, запустив Class.superclass, вы увидите, что он наследуется от Module. Ваша версия не будет (классы, которые явно не указывают суперкласс, по умолчанию будут наследовать от Object) Однако вы можете изменить его, используя send, подробнее читайте здесь => http://ruby -doc.org / core-1.9.3 / Object.html # method-i-send

2 голосов
/ 17 февраля 2012

Мой сеанс IRB:

1.9.2p290 :001 > class MyClass
1.9.2p290 :002?>   def initialize(name = nil, age = nil, weight = nil)
1.9.2p290 :003?>     @name = name
1.9.2p290 :004?>     @age = age
1.9.2p290 :005?>     @weight = weight
1.9.2p290 :006?>     end
1.9.2p290 :007?>   end
 => nil 
1.9.2p290 :010 > p1 = MyClass.new("Joe", 12, 135)
 => #<MyClass:0x00000002226a08 @name="Joe", @age=12, @weight=135> 
1.9.2p290 :011 > p2 = MyClass.new("Jack", 29, 200)
 => #<MyClass:0x00000002212b98 @name="Jack", @age=29, @weight=200> 
1.9.2p290 :013 > p3 = MyClass.new("Jill", 44)
 => #<MyClass:0x000000021c9600 @name="Jill", @age=44, @weight=nil> 
1.9.2p290 :014 > ap p1
#<MyClass:0x02226a08
    @age = 12,
    @name = "Joe",
    @weight = 135
>
 => #<MyClass:0x00000002226a08 @name="Joe", @age=12, @weight=135> 
1.9.2p290 :015 > ap p2
#<MyClass:0x02212b98
    @age = 29,
    @name = "Jack",
    @weight = 200
>
 => #<MyClass:0x00000002212b98 @name="Jack", @age=29, @weight=200> 
1.9.2p290 :016 > ap p3
#<MyClass:0x021c9600
    @age = 44,
    @name = "Jill",
    @weight = nil
>
 => #<MyClass:0x000000021c9600 @name="Jill", @age=44, @weight=nil> 

Как видите, глобального переопределения @weight.

нет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...