Help us understand the problem. What is going on with this article?

Rubyのクラスまとめ

More than 1 year has passed since last update.

Rubyのクラスについてまとめます。

インスタンスとインスタンスメソッド

クラスからインスタンスを生成するにはnewメソッドを使用します。
クラス内に定義したメソッドはそのインスタンスから呼び出せます。このメソッドをインスタンスメソッドと言います。
クラスにはインスタンスメソッドとしてinitializeが用意されており、インスタンス化時の処理をここに書くことができます。(不要な場合は省略可)

class Foo
  def initialize
    p 'initialize!!!'
  end

  def sample_method
    p 'sample_method!!!'
  end
end

foo = Foo.new # => "initialize!!!"
foo.sample_method # => "sample_method!!!"

インスタンス変数

  • インスタンス内でのみ参照可能な変数で状態を保持できる
  • 外から参照するにはアクセサを定義する必要がある
  • インスタンス変数の定義は@barのように先頭に@を付ける
class Foo
  def initialize
    @bar = 'instance!!!'
  end

  def sample_method
    p @bar
  end
end

foo = Foo.new
foo.sample_method # => "instance!!!"

インスタンス変数に外部からアクセスする

インスタンス変数に外部からアクセスするには以下のメソッドを追加する必要があります。

  • 代入するメソッド
    • Foo#bar=
  • 参照するメソッド
    • Foo#bar
class Foo
  def bar=(value)
    @bar = value
  end

  def bar
    @bar
  end
end

foo = Foo.new
foo.bar = 'instance!!!' # syntax sugarが用意されており、foo.bar= と書かなくても代入のように書ける
foo.bar # => "instance!!!"

これを簡単にしたのがattr_accessorでアクセサと呼ばれます。
アクセサを用いることで、上記のようにわざわざメソッドを定義しなくてもこれだけで外部からインスタンス変数を使用することができます。実態はFoo#bar=メソッドやFoo#barメソッドをattr_accessorが作っているのです。

class Foo
  attr_accessor :bar # 引数は可変長のため複数定義が可能 => attr_accessor :bar_a, :bar_b
end

foo = Foo.new
foo.bar = 'instance!!!'
foo.bar # => "instance!!!"

クラスメソッド

インスタンス化せずともクラスに対して直接メソッドを呼び出すことができます。
クラスメソッドの定義はself.sample_method のようにself. をメソッド名の前につけます。

class Foo
  def self.sample_method
    p 'class method!!!'
  end
end

Foo.sample_method # => "calss method!!!"

また以下のように class << self..end の中にメソッドを定義することでも、クラスメソッドとなります。こうすることで複数まとめてクラスメソッドを定義でき、ネストすることでインスタンスメソッドとの区別が明確になります。

class Foo
  class << self
    def method_bar
      p 'class method bar!!!'
    end

    def method_baz
      p 'class method baz!!!'
    end
  end
end

Foo.method_bar # => "calss method bar!!!"
Foo.method_baz # => "calss method baz!!!"
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした