重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

すみません。Rubyで、インスタンス変数とクラス変数の使い方と違いを教えて頂けると幸いです。

A 回答 (2件)

No1です。

誤記がありました。

誤:
p1.say()とp1.say()は、@@shameiに"???"が設定されているので
正:
p1.say()とp2.say()は、@@shameiに"???"が設定されているので

誤:
p1.say()とp1.say()は、@@shameiに"SONY"が設定されているので
正:
p1.say()とp2.say()は、@@shameiに"SONY"が設定されているので

以上、訂正いたします。
    • good
    • 0

インスタンス変数は、変数名の先頭に@がつくものです。


後述しますが、@name,@ageの変数が該当します。
これは、インスタンス毎に、別々の値を保持することができます。

クラス変数は、変数名の先頭に@@がつくものです。
後述しますが、@@shameiの変数が該当します。
この変数は、そのクラスから作成したインスタンスであれば、どのインスタンスであっても
同じ値が設定されます。また、あるインスタンスで、クラス変数の値を変えると、
全てのインスタンスのクラス変数の値が同じ値で変わります。
後述で p1.set_shamei("SONY")を行うと、
p1の@@shameiが"SONY"になりますが、p2の@@shameiも"SONY"になります。


インスタンス変数の用途は、インスタンス毎に別々の値を持ちたいときに使用します。
例えば、ある会社の会社員のクラスを作るとき、
名前と年齢は、社員ごとに異なるので、インスタンス変数にします。

クラス変数の用途は、そのクラス内で共通した値を持ちたいときに使用します。
例えば、ある会社の会社員のクラスを作るとき、
会社名は、全ての社員で同じなので、クラス変数にします。

以下、サンプルです。
--------------------------------------------------------
class Foo
@@shamei = "???"
def initialize(name,age)
@name = name #名前
@age = age #年齢
end
def set_shamei(shamei)
@@shamei = shamei
end
def say()
puts("My company name is " + @@shamei)
puts("My name is " + @name)
puts("I am " + @age.to_s + "years old")
end
end
p1 = Foo.new("yamada",18)
p2 = Foo.new("satou",20)
p1.say()
p2.say()
p1.set_shamei("SONY")
p1.say()
p2.say()
--------------------------------------------------------
上記を実行すると、
My company name is ???
My name is yamada
I am 18years old
My company name is ???
My name is satou
I am 20years old
My company name is SONY
My name is yamada
I am 18years old
My company name is SONY
My name is satou
I am 20years old
となります。

p1.set_shamei("SONY")の前の行の
p1.say()とp1.say()は、@@shameiに"???"が設定されているので
My company name is ???
となります。

p1.set_shamei("SONY")の後の行の
p1.say()とp1.say()は、@@shameiに"SONY"が設定されているので
My company name is SONY
となります。

実際に、実行して確認してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A