1

最初に nil として初期化されたインスタンス変数はどこにありますか? すべてのインスタンスに対してデフォルトで他の値として再定義できますか?

例えば:

class Class
  #some code here or maybe in an Object class
end

class Foo1
  attr_accessor :bar
end

class Foo2
  attr_accessor :bar
end

p Foo1.new.bar # result is not nil
p Foo2.new.bar # result is not nil

これは、リーダーを変更することで実行できます。

class Class
  def attr_accessor(attr_name)
    ...
    define_method "#{attr_name}" do
      if instance_variable_get "@#{attr_name}_history"
        instance_variable_get "@#{attr_name}_history"
      else
        "Not nil"
      end
    end
    ...
  end
end

しかし、これは Ruby のコアを理解するのに役立ちません。どうもありがとう!

4

3 に答える 3

5

デフォルト値を設定したい場合initializeは、クラスのメソッドで割り当てることができます。

例えば:

class Test

  attr_accessor :bar

  def initialize
    @bar = 'bar'
  end

end

Test.new.bar
# => "bar"

attr_accessor :bar基になるインスタンス変数を設定および取得するためのヘルパー メソッドが提供されることを思い出してください@bar

多くのクラスのデフォルト値が必要な場合は、インスタンス変数を非 nil として設定するクラスから継承させることができます。

class Foo < Test

end

Foo.new.bar
# => "bar"
于 2013-01-25T17:57:20.780 に答える
0

class で新しいメソッドを定義しClassます。インスタンス変数を取得:instance_variablesし、使用して好きなものに設定します:instance_variable_set(:@var,default_value)

class Class

    alias oldNew new
        def new(*args)
        result = oldNew(*args)
        default = 2354 # set default here
        a = result.instance_variables
        a.each do
        |d|
        result.instance_variable_set(d,default)
        end

    return result
    end

end
于 2013-01-25T18:54:25.610 に答える
0

(Jörg W Mittag のコメントに従って修正)

いいえ、あなたがすることはできません。インスタンス変数は、値を割り当てずに呼び出すと、評価されるように設定されます。nil

于 2013-01-25T16:26:02.300 に答える