2012-02-17 3 views
0

私はクラスからいくつかのオブジェクトを作成しようとしています。Ruby 'open class'-concept

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) 

問題は、オブジェクトが同じ数のパラメータを保持しないということです。私は人を作成しようという重みを「持っているdoes'nt」:

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

は、これは私が何を意図したものではありませんこれは、同様に彼らのwheightを除去することで、以前に作成されたオブジェクトに影響を与えます。これを回避する方法はありますか?クラスを閉じますか? または私は何か重要なものを逃していますか?

答えて

2

マイ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のグローバルなオーバーライドがありません見ての通り。

+0

これは、それが、この中でaswell私のために正常に動作し、奇妙です単純化されたバージョンですが、私の大きなプログラムで実行しようとすると、前のバージョンに削除されるようです。作成されたオブジェクトの値。ありがとう。 – BSG

4

クラス 'クラス'を呼び出さないでください。各クラスはClassクラスのインスタンスです。

2

Classを再定義しようとしていますが、それはできません。それはすでに存在します。あなたが定義していると思うClassはあなたのバージョンではありません。それは既に存在するものです。 Class.superclassを実行するとこれを確認できます。Moduleから継承されていることがわかります。お使いのバージョンではなりません(明示的にスーパークラスを指定していないクラスはObjectから継承するデフォルトになります) あなたはしかしお送り使用して、それを修正することができ、より多くのを読んでそこ=>http://ruby-doc.org/core-1.9.3/Object.html#method-i-send