インスタンスメソッド・インスタンス変数
インスタンスメソッドはオブジェクトから呼び出したり、同じクラス内の別メソッドから呼び出すことができます。
class User
attr_accessor :name, :birthday
def initialize(name, birthday)
@name = name
@birthday = birthday
end
#インスタンスメソッド
def display_birthday
#インスタンス変数
@birthday.strftime('西暦%Y年 %m月 %d日')
end
def call_display_birthday
#インスタンスメソッドはクラス内の別のメソッドから呼び出すことができる。
self.display_birthday
display_birthday
end
end
birthday = Date.new(1999, 11, 11)
user = User.new('nabe', birthday)
puts user.display_birthday
puts user.call_display_birthday
アクセス修飾子
アクセス修飾子には以下の3つがあります。
- publicメソッド
- privateメソッド
- protectedメソッド
publicメソッド
以下の例の「display_birthday」のように単純にクラス内に定義したメソッドはpublicメソッドになります。
publicメソッドはオブジェクトから直に呼び出すことができます。
また、自身のオブジェクトを呼び出す際に、先頭に「self」をつけますが、省略もできます。
require 'date'
class User
attr_accessor :name, :birthday
def initialize(name, birthday)
@name = name
@birthday = birthday
end
#インスタンスメソッド(publicメソッド)
def display_birthday
@birthday.strftime('西暦%Y年 %m月 %d日')
end
def call_display_birthday
#自身のオブジェクトを呼び出す場合は先頭に「self」をつける(publicメソッドの呼び出し)
self.display_birthday
#「self」を省略することもできる(publicメソッドの呼び出し)
display_birthday
end
end
birthday = Date.new(1999, 11, 11)
user = User.new('nabe', birthday)
puts user.display_birthday
puts user.call_display_birthday
privateメソッド
クラス外部には公開されないメソッドでクラス内のメソッドから呼び出して使われるメソッドになります。
「private」以下に記載し、呼び出す際は「self」をつけない関数形式で呼び出します。
require 'date'
class User
attr_accessor :name, :birthday
def initialize(name, birthday)
@name = name
@birthday = birthday
end
def call_private_name
#同じクラス内では呼び出せる
#「self」をつけては呼び出せない
private_name
end
private
def private_name
@name
end
end
birthday = Date.new(1999, 11, 11)
user = User.new('nabe', birthday)
#クラス外では呼び出すとエラーになる
puts user.private_name
protectedメソッド
基本的に「private」メソッドと同様にクラス外部には公開されないメソッドでクラス内のメソッドから呼び出して使われるメソッドになります。
ただ、「protected」の場合は「self」をつけて呼び出すことができます。
class User
def uesr_method
protected_method
self.protected_method
private_method
self.private_method
end
protected
def protected_method
puts 'protected'
end
private
def private_method
puts 'private'
end
end
user = User.new
user.uesr_method
->
protected
protected
private
NoMethodError: private method `private_method' called for #<User:0x00007fc0cca622e8>
Did you mean? private_methods
from (pry):7:in `uesr_method'
破壊的メソッド
メソッドの末尾に「!」をつけたものは破壊的メソッドと呼ばれるものになります。
破壊的メソッドを使用すると、レシーバーの値を変更するメソッドになります。
以下の例を見ていただくと、「str.upcase!」の場合では戻り値だけでなく「str」の値も変更されていることがわかると思います。
[5] pry(main)> str = 'string'
=> "string"
[6] pry(main)> str.upcase
=> "STRING"
[7] pry(main)> str
=> "string"
[8] pry(main)> str
=> "string"
[9] pry(main)> str.upcase!
=> "STRING"
[10] pry(main)> str
=> "STRING"
コメント