【12日目②:Rubyのクラスメソッドについてやで】改訂3版基礎Ruby on Railsを読んだで!

シェアする

  • このエントリーをはてなブックマークに追加
41AkxXsz+5L._SX258_BO1,204,203,200_

クラスメソッドと定数

クラス自身にも機能持たせれるんすよ。

クラスメソッド

クラスのインスタンスではなくクラス自身に特定の機能を持たせるには
クラスメソッドを作る。

クラスメソッドは「クラス名.メソッド名」のように呼び出せる。
クラスメソッドを定義するには、クラスの中で「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のようにクラス名に::を付けて参照する。

本記事は下記本の勉強記事です。初学者にとても良い本です。

スポンサーリンク
Sponsored Link
Sponsored Link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
Sponsored Link