🍒

Ruby クラス

2023/02/08に公開

クラス

今まで文字列を扱ったときに使った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