##Rubyの変数の定義について、今回はインスタンス変数
前回はローカル変数について書きました
続いてインスタンス変数です。
命名規則
変数の先頭は@
変数の構成は英数字と_
@student = "Taro"
@_student_2 = "Jiro"
@STUDENT_3 = "Sabu"
@4_STUDENT_4 = 'Fourth' #@の隣に数字は定義できない
SyntaxError:`@4' is not allowed as a class variable name
#ちなみに初期値を設定しないで呼び出すと「nil」になる
@student_5
puts @student_5
=> nil
スコープ
そのインスタンス内で参照できる
@student = "Taro" #インスタンス変数を定義 ことのき"Taro"というStringクラスのインスタンスが生成
puts @student
Taro
=> nil
3.times do |n|
puts @student
end
Taro
Taro
Taro
=> 3
def students
@student
end
students #Stringクラスを継承しているインスタンス内なので参照が可能
Taro
=> nil
class Students
puts @student
end
#クラスの外部の@studentをクラス内部で読み込むことはできない
=> nil
ではなぜStudentsクラスから@studentが呼び出せないか。
理由はインスタンス変数はインスタンス内で参照ができるからです。
どういうことか?そもそもインスタンスとはなにか??
インスタンスとは
クラスは設計図でクラスで作られたものがインスタンスです。
たとえば
@student = "Taro"
@student.class
=> String
のように@studentはStringクラスのインスタンスです。
たとえばこうすると
@student = 123
@student.class
=> Fixnum
となり@studentはFixnumクラスのインスタンスとなるのです。
つまりStudentsクラスで作ったインスタンスであれば、インスタンスごとにStudentsクラス内で呼び出すことができます。
class Students
def name=(name)
@student = name
end
def greet
puts "Hi,#{@student}!!"
end
end
a = Students.new
a.name = "Hanako"
a.greet
"Hi,Hanako!!"
b = Students.new
b.name = "Yoshiko"
b.greet
"Hi,Yoshiko!!"
インスタンスを作成するごとに、インスタンス変数に値を代入して呼び出すことができる。
ただしこれだといちいちインスタンスを呼び出して値を代入しないといけないので、インスタンスを作成するタイミングで値を引数に入れて代入するinitializeメソッドを使うのが一般的かなと思います。
class MedicalStudents
attr_accessor :name
def initialize(name)
@student = name
end
def greet
"Hi,#{@student}!!"
end
end
a = MedicalStudents.new("Hanako")
a.greet
"Hi,Hanako!!"
a.name = "Yoshiko"
a.geet
"Hi,Yoshiko!!"
以上がインスタンス変数でした。
またインタンスの生成などはオブジェクトとはの段階から理解したほうが良いということが分かりました。
ここでは詳しく説明してないので次回以降に書けたらいいなと思います!!