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}です"
end
end

このコードでは、Userというクラスを作成しています。このクラスには次の機能があります。

  1. initialize: 最初に名前を設定する
  2. name: 名前を取得する
  3. set_name: 名前を変更する
  4. greet: 挨拶文を表示する

このクラスの動作を確認するために、次のコードを追加しましょう。

# ユーザーを作成
user = User.new("山田")
puts user.name # 「山田」と表示されます
# 名前を変更
user.set_name("鈴木")
puts user.name # 「鈴木」と表示されます
# 挨拶を表示
user.greet # 「こんにちは、鈴木です」と表示されます

このコードは問題なく動きますが、いくつか気になる点があります。

  1. @nameという書き方が何度も出てきて、繰り返しが多い
  2. 名前を変更するメソッド名がset_nameと少し長い
  3. @nameに直接アクセスしている箇所が多い

もっと簡単に書く方法があります。それがattr_accessorselfの組み合わせです。

先ほどのコードをattr_accessorselfを使って書き直してみましょう。

class User
attr_accessor :name
def initialize(name)
self.name = name
end
def greet
puts "こんにちは、#{self.name}です"
end
end
# 動作確認
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 = name
end
def greet
puts "こんにちは、#{self.name}です"
end

ここでselfは「このオブジェクト自身」を意味します。

self.name = nameは「このオブジェクトのname=メソッドを使って、引数のnameの値を設定する」という意味です。

同様に、self.nameは「このオブジェクトのnameメソッドを使う」という意味です。

補足: selfの省略

定義された変数を使う場合、selfを省略することもできます。例えば、以下のように nameself で参照するコードがあったとします。

def greet
puts "こんにちは、#{self.name}です"
end

この場合、selfを省略して次のように書くこともできます。

def greet
puts "こんにちは、#{name}です"
end

どちらも同じ意味ですが、selfを省略することでコードがすっきりします。

ただし、selfを省略できるのは、メソッドの中で自分自身のインスタンス変数やメソッドにアクセスする場合だけです。initializeメソッドの中の self.name = name のように、新たに値を設定する場合は、selfを使う必要があります。

# NG
def initialize(name)
name = name
end
# OK
def initialize(name)
self.name = name
end

このように、selfを使うことで、どの変数がどのオブジェクトに属しているのかが明確になります。

慣れないうちはあえて省略せずに、selfを使うことをお勧めします。そうすることで、コードの可読性が向上し、後から見返したときに理解しやすくなります。

まとめ

本章では、selfの基本的な使い方について学びました。以下のポイントを理解できたことと思います。

  • selfは「このオブジェクト自身」を指すキーワードである
  • attr_accessorとselfを組み合わせると、コードをすっきりと書ける
  • selfを使うことで、インスタンス変数に直接アクセスする代わりに、メソッドを通してアクセスできる
  • selfを省略できる場面と省略できない場面がある

selfを適切に使うことで、より読みやすく、メンテナンスしやすいコードを書くことができます。初めは少し慣れが必要かもしれませんが、使いこなせるようになると、Rubyらしい簡潔なコードが書けるようになります。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
クラス変数を理解しよう