今回はRubyを学習していて最初につまづくであろう「引数」について初心者向けに解説したいと思います。引数は値を受け渡しする上で必ず使う機能なので、この機会におさらいしておきましょう。

変数が使える範囲を理解しよう
前提として理解しておいて欲しいポイントは以下の2つになります。
- 変数の定義
- 変数のスコープ
変数の定義
変数とは、何度も使用するデータに名前をつけて格納しておく箱のようなものです。変数を定義することで何回でもその値を利用することができます。
# 変数を定義する
name = "千葉"
puts "私の名前は#{name}です。"
=>私の名前は千葉です。
puts "出身地は#{name}県です。"
=>出身地は千葉県です。
#{}
は「式展開」と呼ばれるもので、文字列の中に変数を代入することができる記述方法です。
変数のスコープ
先ほど説明した変数には利用できる範囲があります。これを変数のスコープといいます。
以下は変数のスコープ内であるため、正常に変数を利用できます。
# 変数を定義する
name = "千葉"
puts "私の名前は#{name}です。"
=> 私の名前は千葉です。
一方で以下の例の場合、変数のスコープ外であるためエラーが起きてしまいます。
# 変数を定義する
name = "千葉"
def person
puts "私の名前は#{name}です。"
end
# メソッドを呼び出す
person
=> エラー
以下の記述の場合は「田中」という変数が用いられます。
# 変数を定義する
name = "千葉"
def person
name = "田中" # 変数を定義する
puts "私の名前は#{name}です。"
end
# メソッドを呼び出す
person
=> 私の名前は田中です。
これらから、メソッド内(def end
で囲まれた範囲)ではメソッド内で定義した変数しか使えないということが分かると思います。スコープ外でも値(変数)を使用できるようにしてくれるのが、引数と呼ばれる考え方になります。
引数とは
引数とはメソッド(def end
)に渡すことのできる「値」のことです。これにより、スコープ外にある変数をメソッドの中で扱うことができます。
def first_name(name) # 仮引数
puts "私の名前は#{name}です。"
end
name = "千葉"
first_name(name) # 本引数
=> 私の名前は千葉です。
上記を見てみるとname = "千葉"
はメソッド外で定義されています。それにも関わらず、「私の名前は千葉です。」と正常に表示されているのはなぜでしょうか。
それはname
という変数がfirst_name
に引数として渡されているためです。
図にまとめてみました。

name = "千葉"
という変数を定義- 先ほど定義した
name
という変数が、本引数としてfirst_name
に代入される - 本引数(②の
name
)の値が、仮引数のname
に渡される - 仮引数の
name
(③のname
)がputs
中の文に代入される
複数の引数を定義する場合
以下のように複数の引数を定義することも可能です。
def person(last_name, first_name, age)
puts "私の名前は#{last_name} #{first_name}で#{age}歳です。"
end
last_name = '田中'
first_name = '太郎'
age = 35
person(last_name, first_name, age)
=> 私の名前は田中 太郎で35歳です。
順序を考慮しなかった場合、期待と異なる結果が出力されてしまうため注意しましょう。
def person(last_name, first_name, age)
puts "私の名前は#{last_name} #{first_name}で#{age}歳です。"
end
last_name = '田中'
first_name = '太郎'
age = 35
person(age, last_name, first_name)
=> 私の名前は35 太郎で田中です。
引数を使用する上でのポイント
引数を使用する上でのポイントは以下の2つです。
- 引数はメソッドを呼び出す部分とメソッドを定義している部分の両方に書く
- 仮引数と本引数の名前は一致しなくても良い
引数はメソッドを呼び出す部分とメソッドを定義している部分の両方に書く
メソッドを呼び出す部分は「本引数」、メソッドを定義している部分は「仮引数」と呼ばれます。def
の直後に記載されているのが仮引数、呼び出し部分に記載されているのが本引数になります。
def multi(number) # 仮引数
puts number * number
end
puts "数字を入力してください"
number = gets.to_i
multi(number) # 本引数
仮引数と本引数の名前は一致しなくても良い
仮引数と本引数の名前が同じである必要はありません。仮引数をnumber
、本引数をvalue
に変更しましたが、以下のコードは正常に動作します。
def multi(number) # 仮引数
puts number * number
end
puts "数字を入力してください"
value = gets.to_i
multi(value) # 本引数
まとめ
- 変数とは何回も使うデータを名前をつけて格納しておく箱のようなもの
#{}
は「式展開」と呼ばれるもので、文字列の中に変数を代入することができる記述方法- メソッド内ではメソッド内(
def end
で囲まれた範囲)で定義した変数しか使えない - 引数とはメソッド(
def end
で囲まれた範囲)に渡すことのできる「値」のこと - 引数はメソッドを呼び出す部分とメソッドを定義している部分の両方に書く
- 仮引数と本引数の名前は一致しなくても良い
今回はRubyを学習していて最初につまづくであろう「引数」について初心者向けに解説しました。Rubyを扱う上で(厳密にはプログラムを書く上で)、引数は必ず用いられる概念のためぜひこの機会に理解しておきましょう。