14

次のサンプルルビークラスを検討してください

class User
  def hello
    puts "hello"
  end
end

今、初期化のために。2つの方法があります

正規変数

1.9.3p125  > tr = User.new
 => #<User:0x98778c4>
1.9.3p125  > tr.hello
 Hello world
 => nil`

インスタンス変数:

1.9.3p125 > @tr = User.new
 => #<User:0x9890f2c>
1.9.3p125 > @tr.hello
Hello world
 => nil

どちらの場合も同じように機能します。では、通常の変数とインスタンス変数の違いは何ですか?

4

3 に答える 3

35

通常の変数は、現在のコンテキスト内でのみスコープを持ちます。インスタンス変数は、クラスの1つのインスタンス全体にスコープを持ちます。あなたの場合、コンテキストが。mainのインスタンスとして機能するため、混乱していますObject

次のことを考慮してください。これにより、状況がより明確になる可能性があります。

class User
  def set_name
    @name = "Bob"
    surname = "Cratchett"
  end

  def hi
    puts "Hello, " + @name
  end

  def hello
    puts "Hello, Mr " + surname
  end
end

irb(main):022:0> u = User.new
=> #<User:0x29cbfb0>
irb(main):023:0> u.set_name
irb(main):024:0> u.hi
Hello, Bob
=> nil
irb(main):025:0> u.hello
NameError: undefined local variable or method `surname' for #<User:0x29cbfb0 @name="Bob">
于 2012-04-23T12:52:53.860 に答える
4

通常の変数はローカル変数と呼ばれ、それが定義されたコード構造に対してローカルです(メソッドで定義した場合、そのメソッドの外部からアクセスすることはできません)。

インスタンス変数は、オブジェクトの特定のインスタンスに対してローカルです。1つのオブジェクトがインスタンス変数の値を変更した場合、変更はそのオブジェクトに対してのみ発生します。

クラスのすべてのインスタンスにローカルなクラス変数もあります。

@@class_variable = 'a class variable'

また、プログラム内のどこからでもアクセスできるグローバル変数:

$global_variable = 'a global variable'

于 2012-04-23T12:48:42.850 に答える
2

ローカル変数は、それが定義されているメソッド内でのみ使用できます(または、変数がトップレベルで定義されている場合は、メソッドの外部でのみ使用できます)。インスタンス変数は、同じインスタンスで呼び出される任意のメソッドから使​​用できます。

違いを確認できる例を次に示します。

@tr = User.new

def foo
  @tr.hello
end

foo
# Hello World


tr = User.new

def bar
  tr.hello
end

bar
# Exception because tr is not accessible from within bar
于 2012-04-23T12:48:34.417 に答える