ie-developers / ie-questions

public questions for ie students.
10 stars 0 forks source link

変数は何処。同じ変数名だけど違いは何。 #7

Closed kazuminn closed 9 years ago

kazuminn commented 9 years ago

例えば、 

class Hoge
    def initialize(i)
          @jeje = i
        piyo = @jeje
    end
end

huga = Hoge.new(3)
puni  = Hoge.new(4)

ってすると hugaとpuniの変数piyoがありますよね。 これは、指し示すオブジェクトが異なる違うやつですよね。 hugaのpiyo変数は3.object_id、puniのpiyo変数は4.obuject_idを指し示す(持ってる)と思うのですが.

違いは何によって認識され、 piyo変数はどこに格納されているのですか?

atton commented 9 years ago

変数の違いはスコープによって区別されますね。

基本的には

#include <stdio.h>
int main(int argc, char const* argv[]) {
    int a = 100;
    printf("%d\n", a); // 100
    {
        int a = 10;
        printf("%d\n", a); // 10
    }
    return 0;
}

の話と同じです。a って変数があってもスコープが違えば値は違う。 特にこのソースの場合は区別されるのは @jeje かな。 この場合は @ が付いてるのでクラスごとのインスタンス変数なんだけれど、スコープがインスタンスごとに違う、と思えば良いかな。 名前は同じなんだけれどスコープが違うから違うものとして認識される。 それが

違いは何によって認識され、

への解答かな。

あと、

piyo変数はどこに格納されているのですか?

への解答はしづらいかな。「どこ」ってのは何だろう。 ひどく大ざっぱに言えばもちろんメモリに確保される。 具体的にどう確保されるかは ruby の変数がどう確保されるかみたいな話で、それは実装にによるかなー。 特にこの「piyo」だと、有効なスコープは initialize の中だけなので、 method 内でのみ有効な変数としてメモリに割り当てられると思う。

kazuminn commented 9 years ago

なるほど。

良くわかりました。

ありがとうございます。