0

たとえば、ItemCollectionというクラスがあり、ItemCollection.quantityを呼び出すとします。括弧は不要なので、これがItemCollectionのquantity変数にアクセスするのか、quantity()関数を呼び出すのかをどのように知ることができますか?また、Rubyクラスのフィールドの場合、それらはプライベートですか、パブリックですか?

コメントはゲッターのための私の質問に答えました。しかし、数量変数があり、数量の値を取得/設定する代わりに何か他のことを行うquantity()関数がある場合はどうなりますか?Rubyは、私が実際に意味するものをどのように判断しますか?

4

2 に答える 2

0

1. 小文字(a,b..)で始まっていますか?

を。Ruby はそれがローカル変数かどうかをチェックします。
b. Ruby はメソッドかどうかをチェックします。
c. Ruby は method_missing を呼び出します

2. 大文字(A,B..)で始まりますか?

を。Ruby は定数かどうかをチェックします。
b. Ruby は const_missing を呼び出します

3. メソッド呼び出し(object.method)ですか?

を。
Ruby はメソッドbかどうかをチェックします。Ruby は method_missing を呼び出します

したがって、オブジェクトの外側(steenslagが言ったように)rubyは3を行い
ます。オブジェクト/クラス定義の内側では、1/2になります:

class E    
  def a()
    'a'
  end
  def get_a()
    a=42
    puts a 
  end
end
E.new.get_a() #42

しかし、この場合:

class A
  a=42
  def get_a()
    a
  end
end
A.new.get_a() # NameError: undefined local variable or method `a' for #<A:0x3820368>

変数aはA のあるバージョンに属しているため、クラス A のインスタンスとクラス A 自体は、クラスを宣言した後、 a について認識しません。

于 2013-10-13T13:26:17.790 に答える
0

メソッドを介してのみ、クラス内の変数に直接アクセスする方法はありません (イントロスペクションを除く)。

于 2013-02-27T22:52:39.237 に答える