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プラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。