2012-04-23 12 views
11

は、初期化のために、今通常の変数とRubyのインスタンス変数との違いは何ですか?

class User 
    def hello 
    puts "hello" 
    end 
end 

次のサンプルルビークラスを考えてみましょう。今

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

、どちらの場合も、それは同じように動作します:二つの方法

通常の変数

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

インスタンス変数があります。だから、通常の変数とインスタンス変数の違いは何ですか?

答えて

29

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

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"> 
物事を明確にする可能性がある、次の点を考慮して
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 
4

は、ここでは、違いを見ることができます例ですそれ以外の方法ではアクセスできません)。

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

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

@@class_variable = 'a class variable'

そしてグローバル変数、プログラム中のどこからでもアクセス可能:

$global_variable = 'a global variable'

関連する問題