Ruby

【初心者向け】Ruby学習者が必ずつまずく「引数」について簡単にまとめてみた

Ruby

 

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

Ruby2.0からキーワード引数が登場しましたが、ここでは通常の引数のみ解説しています。キーワード引数については以下の記事を参考にしてください。
Ruby
【Ruby】引数の可読性を高めることができるキーワード引数について簡単にまとめてみた引数の可読性を高めることができる機能「キーワード引数」について簡単にまとめています。基本的に引数が2つ以上になる場合はキーワード引数を設定し、可読性の高いコードになるよう心掛けましょう。...

変数が使える範囲を理解しよう

前提として理解しておいて欲しいポイントは以下の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に引数として渡されているためです。

図にまとめてみました。

引数の流れ
  1. name = "千葉"という変数を定義
  2. 先ほど定義したnameという変数が、本引数としてfirst_nameに代入される
  3. 本引数(②のname)の値が、仮引数のnameに渡される
  4. 仮引数の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を扱う上で(厳密にはプログラムを書く上で)、引数は必ず用いられる概念のためぜひこの機会に理解しておきましょう。