2012-01-25 12 views
0

ここで属性@colorはどこに定義されていますか?おそらくコンストラクタの割り当て?この場合、型に複数のコンストラクタがあり、そのうちの1つが@colorに値を割り当てていない場合はどうなりますか?Ruby - ここでの属性定義はどこですか?

class Baz 
    def initialize(color) 
    @color = color 
    end 

    def color 
    @color 
    end 

    def color=(value) 
    @color = value 
    end 
end 
+1

注:ルビでは、クラスに複数の初期化子を定義することはできません。初期値はデフォルト値で定義できます。 'def initialize(color = 'FFFFFF')'です。パラメータを指定せずに 'Baz.new'を呼び出すと、デフォルト値が' @color'に割り当てられます –

+2

私はあなたの質問に答えを投稿しましたが、別のことに注意すると便利です。クラス内部を公開することなく、インスタンス変数への堅牢なインタフェースを作成できます。これについての詳細はこちらを参照してください。http://www.rubyist.net/~slagell/ruby/accessors.html –

+1

これらの属性アクセサを使用することの利点は、後で追加する必要がある場合にメソッドを手動で定義できることです簡単なゲッター/セッターよりも複雑な機能また、入力を省くこともできます。あなたのコード例では、 'color'と' color = 'メソッドを定義する代わりに' attr_accessor:color'と書いて、setter/getterメソッドを自動的に取得することができます。 –

答えて

2

ルビのインスタンス変数は、それ自体が定義されていません。彼らは使用されるときに現れます。

初めてインスタンス変数に何かを割り当てるとき、それは "定義"に最も近いものです(実際はもっと "初期化"です)。まだ値が割り当てられていないインスタンス変数を参照すると、値はnilになります。

あなたのコンストラクタは@colorに値を割り当てていないのであれば、その後、@colorは単純に未初期化のままになります(したがって、それを参照するクラスのどこnilを返す...それは別の場所でコンストラクタ外の値が割り当てられている場合を除きます)。

は、詳細についてはこちらをご覧ください:http://www.rubyist.net/~slagell/ruby/instancevars.html

記事から関連する引用:

インスタンス変数を宣言する必要はありません。これは の柔軟なオブジェクト構造を示します。実際には、各インスタンス変数はオブジェクトが最初に割り当てられたときにオブジェクトに動的に追加される です。

そして:グローバルと同様に

彼らは を初期化されるまでは、インスタンス変数にnil値を持ちます。

+0

ご協力いただきありがとうございます。 – Ben

2

タイプは

まあ、その後、それらのインスタンスは、@colorインスタンス変数を持っていないと操作を@colorする値を代入しません。そのうちの一つ、複数のコンストラクタを、持っているものならばその変数には失敗する可能性があります。

良い設計とテストでは、これらのケースの数をゼロに減らすことはできますが、言語自体があなたを守るものではありません。

特定の例では、唯一の操作が設定(明らかに上手くいく)と取得(これはきれいです)のため問題ではありません。インスタンス変数を取得すると、変数が一度も設定されていない場合はnil

+0

Rubyはメソッドのオーバーロードをサポートしていないため、クラス内に 'initialize'メソッドが1つしかないことを指摘しておく価値があります。 – iftheshoefritz

関連する問題