4

私は Web 開発用の新しい動的スクリプト言語の学習を検討しており、Python と Ruby で悩んだ後、どちらも本当に好きだったので、Ruby を選ぶことにしました英国では Python/Django よりも RoR の仕事が多い)。私の質問は、Ruby のスコープについてです。他のメソッドからアクセスできるようにするには、メソッド内でクラス属性を宣言する必要がありますか?

たとえば、私はできません

class Notes
  @notes = ["Pick up some milk"]

  def print_notes
    puts @notes
  end
end

コンストラクターで使用したい属性を宣言する必要があるようですか? この例は機能します:

class Notes
  def initialize
    @notes = ["Pick up some milk"]
  end

  def print_notes
    puts @notes
  end
end

これは正しいですか?@ の代わりに @@ を前に付けた例 1 が機能することに気付きましたが、クラスにサブクラス (たとえば、メモ) がある場合、Notes で @@ を前に付けた属性を変更すると、メモの値が変更されますか?

これが繰り返しの質問である場合は申し訳ありません。ただの初心者です:)

4

1 に答える 1

4

クラス内で宣言するが@notes、コンストラクターやインスタンスメソッドでは宣言しない場合は、クラス自体@notesのインスタンスのインスタンス変数を作成します。すべてのクラスものインスタンスとして存在します。Class

class Notes
  @notes = ["Pick up some milk"]

      def print_notes
        puts @notes
      end
  end
# => nil
Notes.instance_variable_get(:"@notes")
# => ["Pick up some milk"]

したがって、答えは「はい」です。コンストラクターまたはその他のインスタンスメソッド内でインスタンス変数を宣言する必要があります。私はあなたがこれをしたいと思うと思います:

class Notes
  def notes
    @notes ||= []
  end

  def print_notes
    puts @notes
  end
end

note = Notes.new
note.notes << "Pick up some milk"
note.notes
# => ["Pick up some milk"]

加えて:

クラス変数は避けてください@@notes。代わりにクラスインスタンス変数を使用してください(これは無意識のうちに行ったことです)。

これを行う:

class Notes
  def self.notes
    @notes ||= []
  end
end

これではない:

class Notes
  def notes
    @@notes ||= []
  end
end

クラス変数が必要な場合。後者は、将来的に問題を引き起こします。(しかし、これは別の会話のためのものだと思います。)

于 2013-03-07T12:22:01.837 に答える