2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Rubyの変数の定義(インスタンス変数)

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!!"

以上がインスタンス変数でした。

またインタンスの生成などはオブジェクトとはの段階から理解したほうが良いということが分かりました。

ここでは詳しく説明してないので次回以降に書けたらいいなと思います!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?