1
0

More than 3 years have passed since last update.

クラスとインスタンスについての考察

Posted at

クラス、インスタンスについて

クラスフィールド・クラスメソッド・インスタンスメソッドのスコープ及びインスタンス変数の効果範囲がいまいち理解できていなかったのでまとめてみました。

理解は深まったのですが、新たな謎が生まれました。

指摘や補足など、教えていただけると幸いです。 

◆記述内容(説明)

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を出力するとクラス名が出力されるのか。

1
0
14

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0