0

ルビー1.9

Ruby でインスタンス変数を定義および初期化する方法を理解していないことに突然気付きました。特定のクラス内でのみ使用する必要がclassあり、クラス外ではまったくアクセスできないため、attr_accessor必要attr_readerなものではありません。

class MyClass

  #how do I initialize it?
  @my_var = 'some value'

  def method1
    #I need to do something with @my_var
    puts @my_var
  end
  def method2
    #I need to do something with @my_var
    puts @my_var
  end
end

a = MyClass.new
a.method1 #empty 
a.method2 #empty

だから私はそれを行う別の方法があることを発見しました

class MyClass

  #is this the only way to do it?
  def initialize
    @my_var = 555
  end

  def method1
    #I need to do something with @my_var
    puts @my_var
  end

  def method2
    #I need to do something with @my_var
    puts @my_var
  end
end

a = MyClass.new
a.method1 #555; it's ok
a.method2 #555; it's ok

さて、2番目のアプローチは正しいものですか?

4

2 に答える 2

3

各クラスには、initialize()他の言語のコンストラクターと同様に機能するメソッドがあり、インスタンス変数はそこで初期化する必要があります。

class MyClass

  def initialize
     @my_var = 'some value'
  end

  # etc...
end
于 2012-08-02T14:18:24.847 に答える
2

はい、initialize正しい方法です。

ただし、次のようにすることもできます。

class MyClass

  def method1
    #I need to do something with @my_var
    puts @my_var ||= 555
  end

  def method2=(x)
    #I need to do something with @my_var
    puts @my_var = x
  end
end

#Test:
x = MyClass.new
x.method1      #555
x.method2= 44  #44
x.method1      #44

method1初めて呼び出されると、変数が初期化されます。

編集: 割り当てると、期待どおりに機能しませんnil

x = MyClass.new
x.method1         #555
x.method2= nil   #nil
x.method1          #again 555

このバージョンはよりうまく機能します:

class MyClass

  def method1
    @my_var = 555 unless defined? @my_var
    puts @my_var 
  end

  def method2=(x)
    puts @my_var = x
  end
end

x = MyClass.new
x.method1         #555
x.method2= nil   #nil
x.method1          #keeps nil
于 2012-08-02T14:25:52.803 に答える