Rubyの変数にはすべて何らかのオブジェクトへの参照が格納されます。
オブジェクトそのものが格納されることはありません。
sample.rb
str1 = "This is a string."
str2 = str1
p str1.equal? str2 # 参照先は同じ
str2[-1] = '?' # だから出力内容も同じ
p str1
p str2
var1 = 128
var2 = var1
p var2.equal? var1 # この時点では参照先が同じ
var2 *= 2 # こうすると
p var2.equal? var1 # var2には新しいオブジェクトが代入されたようだ
p var1
p var2
出力例
$ ruby sample.rb
true
"This is a string?"
"This is a string?"
true
false
128
256
C/C++などで関数に配列 (ポインタ相当) を渡すときに内部で書き換えるかどうか意識するように、
Rubyでは参照渡ししかないため (特に文字列の場合に) 注意が必要です。
sample.rb
def add_postfix (str)
str << " ...???"
end
str = "This is a string."
add_postfix(str)
p str
出力例
$ ruby sample.rb
"This is a string. ...???"
C/C++などでは、グローバル変数やローカル変数、定数を宣言位置やconst修飾子などで区別しています。
Rubyではそうではなく、変数名で区別しています。
ローカル変数
varなど小文字またはアンダーバーから開始
グローバル変数
$stdout,$varなど$から開始
メンバ変数 (インスタンス変数)
@varなど@から開始
staticメンバ変数 (クラス変数)
@@varなど@@から開始
定数
MAXNなど大文字から開始