selfを使ってコードをスッキリさせよう
学習の目標
本章では、以下の内容を学習します。
- selfとは何かを理解する
- selfを使ってコードを読みやすくする方法を学ぶ
- attr_accessorとselfを組み合わせる方法を習得する
- selfが必要な場面と省略できる場面を知る
はじめに
プログラミングでは、自分自身を表現する方法が必要です。人間が「私は〜です」と言うように、プログラムの中でも「自分は〜です」と表現できると便利ですね。
Rubyでは、この「自分自身」を指し示すために、selfというキーワードを使います。selfを使うと、コードがすっきりと整理され、読みやすくなります。
実際にコードを書きながら、selfの使い方を見ていきましょう。
selfを使わない基本的な実装
まずは、selfを使わないクラスの例を見てみましょう。
VS Codeを開いて、self.rbというファイルを作成し、次のコードを入力してください。
class User  def initialize(name)    @name = name  end
  def name    @name  end
  def set_name(new_name)    @name = new_name  end
  def greet    puts "こんにちは、#{@name}です"  endendこのコードでは、Userというクラスを作成しています。このクラスには次の機能があります。
- initialize: 最初に名前を設定する
- name: 名前を取得する
- set_name: 名前を変更する
- greet: 挨拶文を表示する
このクラスの動作を確認するために、次のコードを追加しましょう。
# ユーザーを作成user = User.new("山田")puts user.name  # 「山田」と表示されます
# 名前を変更user.set_name("鈴木")puts user.name  # 「鈴木」と表示されます
# 挨拶を表示user.greet  # 「こんにちは、鈴木です」と表示されますこのコードは問題なく動きますが、いくつか気になる点があります。
- @nameという書き方が何度も出てきて、繰り返しが多い
- 名前を変更するメソッド名がset_nameと少し長い
- @nameに直接アクセスしている箇所が多い
もっと簡単に書く方法があります。それがattr_accessorとselfの組み合わせです。
先ほどのコードをattr_accessorとselfを使って書き直してみましょう。
class User  attr_accessor :name
  def initialize(name)    self.name = name  end
  def greet    puts "こんにちは、#{self.name}です"  endend
# 動作確認user = User.new("山田")puts user.name  # 「山田」と表示されます
user.name = "鈴木"  # 直感的に名前を変更できますputs user.name  # 「鈴木」と表示されます
user.greet  # 「こんにちは、鈴木です」と表示されます行なった改善の詳細について、一つずつ見ていきましょう。
まず一つ目は attr_accessor です。
attr_accessor :nameこの1行で、先ほど手動で書いたnameメソッドとset_nameメソッドが自動的に作られます。さらに、set_nameの代わりにname=という直感的な名前になります。
これにより、コードの量が減り、読みやすくなりました。
次に、selfの使い方です。
def initialize(name)  self.name = nameend
def greet  puts "こんにちは、#{self.name}です"endここでselfは「このオブジェクト自身」を意味します。
self.name = nameは「このオブジェクトのname=メソッドを使って、引数のnameの値を設定する」という意味です。
同様に、self.nameは「このオブジェクトのnameメソッドを使う」という意味です。
補足: selfの省略
定義された変数を使う場合、selfを省略することもできます。例えば、以下のように name を self で参照するコードがあったとします。
def greet  puts "こんにちは、#{self.name}です"endこの場合、selfを省略して次のように書くこともできます。
def greet  puts "こんにちは、#{name}です"endどちらも同じ意味ですが、selfを省略することでコードがすっきりします。
ただし、selfを省略できるのは、メソッドの中で自分自身のインスタンス変数やメソッドにアクセスする場合だけです。initializeメソッドの中の self.name = name のように、新たに値を設定する場合は、selfを使う必要があります。
# NGdef initialize(name)  name = nameend
# OKdef initialize(name)  self.name = nameendこのように、selfを使うことで、どの変数がどのオブジェクトに属しているのかが明確になります。
慣れないうちはあえて省略せずに、selfを使うことをお勧めします。そうすることで、コードの可読性が向上し、後から見返したときに理解しやすくなります。
まとめ
本章では、selfの基本的な使い方について学びました。以下のポイントを理解できたことと思います。
- selfは「このオブジェクト自身」を指すキーワードである
- attr_accessorとselfを組み合わせると、コードをすっきりと書ける
- selfを使うことで、インスタンス変数に直接アクセスする代わりに、メソッドを通してアクセスできる
- selfを省略できる場面と省略できない場面がある
selfを適切に使うことで、より読みやすく、メンテナンスしやすいコードを書くことができます。初めは少し慣れが必要かもしれませんが、使いこなせるようになると、Rubyらしい簡潔なコードが書けるようになります。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。