クラス、インスタンスについて
クラスフィールド・クラスメソッド・インスタンスメソッドのスコープ及びインスタンス変数の効果範囲がいまいち理解できていなかったのでまとめてみました。
理解は深まったのですが、新たな謎が生まれました。
指摘や補足など、教えていただけると幸いです。
◆記述内容(説明)
class Zoo
def self.kind(animal_name)
@animal_name = animal_name
puts @animal_name #出力:キリン
puts animal_name #出力:キリン
puts @name #出力:空欄
puts name #出力:Zoo
end
def self.kind_name
puts @animal_name #出力:キリン
# puts animal_name #出力:NameError
end
puts @animal_name #出力:空欄
# puts animal_name #出力:NameError
def initialize(new_animal)
@new = new_animal
puts "#{@new}が増えました。" #出力:新たな仲間が増えました。
end
def kind(name)
@name = name
puts @animal_name #出力:空欄
# puts animal_name 出力:NameError
puts @name #出力:ライオン
puts name #出力:ライオン
end
puts @name #出力:空欄
puts name #出力:Zoo
def color(animal_color)
@color = animal_color
# puts name 出力:NameError
puts "#{@new}の#{@name}は#{@color}です" #出力:新たな仲間のライオンは黄色です
# puts name 出力:NameError
end
end
Zoo.kind("キリン")
#クラスメソッドself.kindの実行
Zoo.kind_name
#クラスメソッドself.kind_nameの実行
animal = Zoo.new("新たな仲間")
#animalインスタンスの作成、initializeメソッド実行
puts animal.kind("ライオン")
#animalインスタンスのkindインスタンスメソッド実行
puts animal.color("黄色")
#animalインスタンスのcolorインスタンスメソッド実行
# ↓スコープ外
# puts @animal_name 出力:空欄
# puts animal_name 出力:NameError
# puts @name 出力:空欄
# puts name 出力:NameError
◆ターミナル出力内容
Zoo
キリン
キリン
Zoo
キリン
新たな仲間が増えました。
ライオン
ライオン
新たな仲間のライオンは黄色です
◆結論
・出力内容は、クラス部分含め上から順に読み込まれた内容になる。
・インスタンス変数は、クラスメソッド同士もしくはインスタンスメソッド同士
でなら相互に出力可能。
ただし、クラスメソッドにはインスタンスが作れないので、
@はただクラスメソッド間を繋ぐパイプになる。
・インスタンス変数は、スコープ外に配置してもNameErrorにはならないが、
出力先に空欄を作ってしまう。
◆新たな疑問
・なぜ、インスタンスメソッド以外のクラスフィールド内(クラスメソッド含む)で、
定義されていないnameを出力するとクラス名が出力されるのか。