クラスメソッドと定数
クラス自身にも機能持たせれるんすよ。
クラスメソッド
クラスのインスタンスではなくクラス自身に特定の機能を持たせるには
クラスメソッドを作る。
クラスメソッドは「クラス名.メソッド名」のように呼び出せる。
クラスメソッドを定義するには、クラスの中で「def self.メソッド名 ~ end」とする。
例:Robotクラスにクラスメソッドloadをもたせたもの。
loadメソッドをはタブ区切りテキストを読み込んでRobotオブジェクトの配列を返す。
※Railsのモデルのレコードの取り出しのようにデータベースのテーブル全体を対象にするクラスメソッドがありそれを真似てる。
クラスメソッドの中では、selfはRobotクラスを指すので、
16行目のnewはRobot.newと同じ。
class Robot
def initialize(name, x, y)
@name = name
@x = x; @y = y
end
def to_s
"#{@name}: #{@x},#{@y}"
end
def self.load(fname)
robots = []
File.open(fname, encoding: "utf-8") do |f|
f.each_line do |line|
cols = line.chomp.split(/\t/)
robots << new(cols[0], cols[1], cols[2].to_i)
end
end
robots
end
end
robots = Robot.load("robots.txt")
robots.each { |robo| puts robo }
selfメソッドは所属しているクラスのこと、
つまりクラスメソッドになる。
101ページに詳しくメモった。
クラスメソッドの書き方
クラスメソッドは次のようにも記載できる。
class Robot
class << self
def load(fname)
クラスメソッドの内容・・・・
end
end
end
「class << self ~ end」の間にはクラスメソッドを複数置くことができる、
またメソッド名にself.を付ける必要もない。
クラスの定数
定数は、参照先を変更できない変数です。
Rubyでは、変数名をアルファベットの大文字で始めて、
=でオブジェクトを指せば定数になる。
クラス定義の外側で定数を作るとその定数はプログラムのどこからでも使用可能になる。
クラス定義の中で定数を作るとそのクラス専用のデータであるクラス定数になる。
例:Shapeクラスの中で定数PIを作り、クラスメソッドcircleは、引数rを半径として円の面積を返すもの。
class Shape
PI = 3.14159
def self.circle(r)
r * r * PI
end
end
puts Shape::PI
puts Shape.circle(5)
クラス定数はクラスの中ではインスタンスメソッドの中からも、クラスメソッドの中からもPIで参照できます。
クラスの外部からはShape::PIのようにクラス名に::を付けて参照する。
本記事は下記本の勉強記事です。初学者にとても良い本です。