4

これはRubyコードではほとんど見られませんが、有効なようです。

class Foo
  @bar = "bar"

  def self.print_bar
    puts @bar
  end
end

上記の私の解釈@barは、のインスタンス変数でありFoo、これは。のシングルトン(?)インスタンスですClass

これは、インスタンススコープだけでなくクラススコープでもアクセスできるクラス変数(たとえば)とは異なるように見えます。@@baz

上記のスニペットのようなコードの欠点は何ですか?それとも完全に合理的なコードですか?

4

4 に答える 4

6

はい、これは完全に有効です。また、非常に広く使用されており、スコープが非常に大きいクラス変数(クラス、クラスのすべてのインスタンス、すべてのサブクラス、すべてのサブクラスのすべてのインスタンスなど)よりも一般的に推奨されます。

欠点はありません。クラスはオブジェクトです。オブジェクトはインスタンス変数を持つことができます。何もありません。Rubyのオブジェクトモデルは、Rubyチュートリアルの作成者でさえ、人々が信じたくなるよりもはるか単純です。

于 2013-02-05T20:01:13.377 に答える
3

潜在的な欠点の1つは、@barのサブクラスでは利用できないことですFoo

class Parent
  @bar = 3
  def self.print_bar
    puts @bar # nil
  end
end

class Child < Parent

end

Parent.print_bar # 3
Child.print_bar # nil
于 2013-02-05T19:39:59.523 に答える
2

コードは有効です。クラスインスタンス変数を使用しています。Jörgが言ったように、それらは一般的にクラス変数よりも好まれます。どちらも同じ目的を達成できますが、クラス変数にはいくつかの落とし穴があります。クラス変数とクラスインスタンス変数の長所と短所については、Rubyのクラス変数とインスタンス変数を参照してください。

クラスインスタンス変数を使用することの1つの欠点は、それらが「通常の」インスタンス変数と同じように見えることです。これにより、新しいRubyプログラマーが不意を突かれる可能性があります。以下のメソッドself.print_barprint_barメソッドは、さまざまな@barインスタンス変数を指しています。

class Foo
  @bar = "bar"

  def initialize
    @bar = "foo"
  end

  def self.print_bar
    puts @bar #=> "bar"
  end

  def print_bar
    puts @bar #=> "foo"
  end
end

これは私の意見では大きな欠点ではありませんが、あなたは尋ねました:)

クラスインスタンス変数がサブクラスで使用できないという事実は、必ずしも欠点ではありません。それはすべて、プログラムをどのように動作させるかによって異なります。

于 2013-02-06T00:55:43.513 に答える
1

初期化されていないインスタンス変数にはnil値がありますが、初期化されていないクラス変数はスローされてエラーになります。他の誰かが付け加えたように、クラス変数はサブクラスで利用できます。

これが私が役に立ったと思った2つについて話しているリンクです:

http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

于 2013-02-05T19:51:29.977 に答える