0

以下は、 Ruby のセッターとゲッター メソッドを学習/理解するための試みからの引用です。

あなたの例で起こっていることは、新しいオブジェクト(Human.new)を初期化してから、メソッド(noise =、はいメソッド名に=記号が含まれている)を使用してインスタンス変数を定義することです(つまり、そのインスタンス専用の変数)、最後に別のメソッド呼び出しでそのインスタンス変数を取得します。

質問: 別のメソッド呼び出しでインスタンス変数を取得する必要があるのはなぜですか? Rubyですべてのインスタンス変数を非公開にすることについてどこかで読みました。これは、フォーカスが別のインスタンス/オブジェクトに渡されると、インスタンス変数が破棄されるかアクセスできないため、メソッド呼び出しが必要になるということですか?

4

3 に答える 3

1

そうではありません。何かを設定すると、新しい値が返されます。例えば:

foo = 'bar' #=> "bar"

また:

class Foo
  def bar=(obj)
    @bar = obj
  end
  def bar
    @bar
  end
end

f = Foo.new
f.bar = "FOO" # returns "FOO"
f.bar         # Now also returns "FOO"

別のメソッドを使用する目的は、単に後で変数にアクセスする場合です。

于 2012-12-18T01:09:42.810 に答える
0

プライベート インスタンス変数は、インスタンスの外部からアクセスできません。

これは、クラスが他のオブジェクトから見えてはならない内部状態を追跡できるため、多くの場合便利です。ただし、他のオブジェクトがクラスのインスタンスから値を取得できるようにする場合は、getter メソッドを提供してその値を公開できます。

多くの場合、getter から値にアクセスするオブジェクトは、それらの値を最初に設定したオブジェクトとは異なります。たとえば、この質問をオブジェクトとして表すことができます。ドリューは質問のテキストを設定しました。この質問は、他の人が質問のテキストを取得して読めるようにする方法がない限り、あまり役に立ちません。ゲッターがなければ、有用な回答オブジェクトを作成できる可能性はほとんどありません。アンドリューがやって来て質問を編集したため、ドリューでさえそのゲッターを使用したいと思うかもしれません。ドリューは次のテキストがどのように見えるか知りたいかもしれません。

于 2012-12-18T01:15:31.623 に答える
0

必要に応じてインスタンス変数を公開することを選択できます。ruby は次の構文を提供します。

class Foo
  attr_reader :bar

  def initialize(bar)
    @bar = bar
  end
end

foo_instance = Foo.new('some_value')
puts foo_instance.bar # => 'some_value'

class Foo 行の下に attr_reader が表示され、@bar の値が取得可能になります。

インスタンス変数を開いて変更することもできます。

  class Foo
    attr_accessor :bar

    def initialize(bar)
      @bar = bar
    end
  end

 foo_instance = Foo.new('some_value')
 puts foo_instance.bar # => 'some_value'
 foo_instance.bar = 'another_value'
 puts foo_instance.bar # => 'another_value'

これは attr_accessor を使用して達成され、@bar の内容を表示して変更できます。

于 2012-12-18T18:19:37.763 に答える