クラス内のインスタンス変数は、変数名の前に @ 記号を付けることで表すことができることを理解しています。クラスでのこれの実用的なアプリケーションがいくつかありますRuby で @@variable とはどういう意味ですか?
関数内でこれを行う実用的なアプリケーションは何ですか?
def foo
one = 1
@two = 2
end
クラス内のインスタンス変数は、変数名の前に @ 記号を付けることで表すことができることを理解しています。クラスでのこれの実用的なアプリケーションがいくつかありますRuby で @@variable とはどういう意味ですか?
関数内でこれを行う実用的なアプリケーションは何ですか?
def foo
one = 1
@two = 2
end
あなたの質問は、 と混同@
している可能性があることを示しています@@
。前者は、クラスの特定のインスタンスに関連付けられています。後者は、クラスのすべてのオブジェクトによって共有されます。アレックスの答えを拡張するには:
class Foo
def set_baz(n)
@baz = n
end
def set_zoo(n)
@@zoo = n
end
def get_baz
@baz
end
def get_zoo
@@zoo
end
end
foo = Foo.new
bar = Foo.new
foo.set_baz(1)
foo.get_baz # 1
bar.set_baz(2)
bar.get_baz # 2
foo.get_baz # still 1
foo.set_zoo(3)
foo.get_zoo # 3
bar.set_zoo(4)
bar.get_zoo # 4
foo.get_zoo # also 4
関数メソッド 内でこれを行う実用的なアプリケーションは何ですか?
class Dog
def foo
one = 1
@two = 2
end
def bar
puts @two
puts one
end
end
d = Dog.new
d.foo
d.bar
--output:--
2
1.rb:9:in `bar': undefined local variable or method `one' for #<Dog:0x00000101086810 @two=2> (NameError)
from 1.rb:16:in `<main>'
先頭に @ が付いていないローカル変数は、メソッドの実行が終了すると破棄されます。
はい-しかし、これはクラスのメソッドではなく、通常の関数ではどういう意味ですか?
インスタンス変数 (先頭に @ が 1 つ付いているもの) は、作成時に self であるオブジェクトにアタッチされます。
def do_stuff
puts self #=>main
@val = 10
end
do_stuff
puts self #=>main
main
self はdef の内側と def の外側の両方で呼び出されるオブジェクトと等しいため、この出力は少し変わっています。通常、def は自己を変更しますが、def が最上位にある場合、def は自己を変更しません。
さて、@val が main と呼ばれるオブジェクトにアタッチされていて、self=main の場合、@val を出力してみましょう:
def do_stuff
puts self #=>main
@val = 10
end
do_stuff
puts self.val #`<main>': undefined method `val' for main:Object (NoMethodError)
ああ、そうです。すべてのインスタンス変数はデフォルトでプライベートなので、メインのクラスにいくつかのアクセサーを書きましょう:
def do_stuff
puts self #=>main
@val = 10
end
do_stuff
puts self.class #=>Object
class Object
attr_reader :val
end
puts self.val #=>10
次に、def の作成時に現在のクラスが何であれ、def がアタッチされます。現在のクラスは自分と等しいか、自分がクラスでない場合、現在のクラスは自分のクラスです。上記の例では、do_stuff が作成されたときに self=main:
puts self #main
def do_stuff
puts self
@val = 10
end
self はクラスではないため、現在のクラスは self のクラスであり、これは Object であることがわかります。
puts self.class #Object
したがって、do_stuff は Object クラスにアタッチされます。つまり、これは Object クラスのインスタンス メソッドになります。追加のポイントとして、実際にはプライベート インスタンス メソッドになります。
puts Object.private_methods.grep(/^do/) #=>do_stuff
クラス内の定義も現在のクラスにアタッチされます。
class Dog
puts self #=>Dog
def bark
puts "Woof"
end
end
...しかし、トップレベルとは異なり、定義はクラスのパブリック インスタンス メソッドになります。