Ruby クラス
クラス
今まで文字列を扱ったときに使ったStringクラスや
配列を扱うときに使ったArrayクラスなど、
用意されている様々なクラスを使ってきた
クラスは用意されたものを使うだけでなく、
自分でクラスを作ることもできる!!
ユーザークラスを作ってみる!
Hello!と出力するメソッドを持ったクラスを作る
class User
def hello
puts 'Hello!'
end
end
ユーザークラスを利用してターミナルにHello!と出力させる
ユーザークラスからインスタンスを作る
インスタンスとは、クラスが設計図だとすると、インスタンスは実態
user = User.new
user.hello
Hello!
と出力された
流れとしては、クラスを定義して、
クラスのインスタンスを作って
インスタンス.メソッド名とすることで
処理を呼び出すことができた!!
このクラスにもう少し機能を追加
Hello!という文字列に続いて
自分の名前を出力するようにしてみる
helloメソッドに引数として名前を渡す方法でも良いが
クラスのインスタンスは変数を使って値を保持することができるので
それをやってみる!!
次のように記述する
class User
def initialize(name)
puts 'initialize!'
@name = name
end
def hello
puts "Hello! I am #{@name}."
end
end
emma = User.new('Emma')
emma.hello
initialize
このメソッドはnewが使われたときに呼ばれる特殊なメソッド!
newに引数を渡すとnewが実行されたときに
initialize
メソッドが呼ばれる
渡した引数は変数nameに入る
そして、nameの変数の値を@nameというインスタンス変数と呼ばれる変数に代入
このインスタンス変数は、インスタンスの中であればどこでも使うことができる!
しかし、引数の@がついていないnameは
このinitialize
メソッドの中でしか使えない
User.newでUserクラスのインスタンスが作成され、
変数userに代入される
newが呼ばれたときにinisialize
というメソッドが必ず呼ばれるため
puts 'initialize!'が表示される
続いて引数Emmaは変数nameに渡る
そしてnameをインスタンス変数の@nameに代入
この@nameの変数は、このインスタンス内であればどこでも使えるので
helloメソッドでputsの出力内容の一つとして使うことができる
puts "Hello! I am #{@name}."
出力結果
initialize!
Hello! I am Emma.
一つのクラスからインスタンスは複数作ることができる!
例えばEmmaさんの他にoliviaさんのインスタンスも作りたい場合
emma = User.new('Emma')
emma.hello
olivia = User.new('Olivia')
olivia.hello
このように出力される
initialize!
Hello! I am Emma.
initialize!
Hello! I am Olivia.
アクセサ
インスタンス変数はクラスの外部から参照することはできない
もし外部からインスタンス変数@nameを参照したい場合は
参照用のメソッドを作る必要がある!
class User
def initialize(name)
@name = name
end
def name
@name
end
def name(value)
@name = value
end
end
emma = User.new('Emma')
puts emma.name
emma.name = 'Emily'
puts emma.name
この部分が参照用メソッド
👇
def name
@name
end
インスタンス変数を変更したい場合は同様に
変更用のメソッドを定義
この部分👇
def name(value)
@name = value
end
このように書くことでnameの値を変更できる!
emma = User.new('Emma')
puts emma.name
emma.name = 'Emily'
puts emma.name
puts emma.name ここではEmmaと表示されていて
emma.name = 'Emily' ここでEmilyにインスタンス変数の内容を書き換えて
puts emma.name その結果を出力
出力結果
Emma
Emily
このようにインスタンス変数のことを読み書きするメソッドのことを
アクセサメソッドという
attr_accessor
アクセサメソッドはよく使うので
Rubyでは単純にインスタンス変数の内容を外部から読み書きするのであれば
attr_accessor
というあらかじめ用意されたメソッドを使う
そうすることで、開発者が自分でアクセサメソッドを書く必要がなくなる
自分で書いたアクセサメソッドをコメントアウトして
下記のように記述する!
attr_accessor :name
これで自分でアクセサメソッドを書かなくても
インスタンス変数を参照できるし、インスタンス変数の書き込みもできる
出力結果
Emma
Emily
さっきと同じように出力できていれば OK
attr_reader
次に、インスタンス変数の内容を読み取り専用にしたいとき
attr_accessor
メソッドの代わりにattr_reader
メソッドを使う!
attr_reader :name
そうすると読み取りはできるが
書き込みをしようとするとエラーになる
attr_writer
逆はattr_writerメソッドを使う
attr_writer :name
参照を行うとエラーになり
書き込みのみを行った場合はエラーは発生しない!
もっと進めたかったけど今日はここまで><
明日また頑張る!!
Discussion