1

クラス内のインスタンス変数は、変数名の前に @ 記号を付けることで表すことができることを理解しています。クラスでのこれの実用的なアプリケーションがいくつかありますRuby で @@variable とはどういう意味ですか?

関数内でこれを行う実用的なアプリケーションは何ですか?

def foo
    one = 1
    @two = 2
end
4

3 に答える 3

0

あなたの質問は、 と混同@している可能性があることを示しています@@。前者は、クラスの特定のインスタンスに関連付けられています。後者は、クラスのすべてのオブジェクトによって共有されます。アレックスの答えを拡張するには:

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
于 2013-08-13T22:30:49.360 に答える
0

関数メソッド 内でこれを行う実用的なアプリケーションは何ですか?

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

mainself は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

...しかし、トップレベルとは異なり、定義はクラスのパブリック インスタンス メソッドになります。

于 2013-08-14T03:49:44.143 に答える