Ruby

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

Ruby

 

今回は、プログラミング学習初心者が必ずつまずくと言っても過言ではない「引数」について簡単に説明したいと思います。

よし
よし
引数に関する質問はめちゃめちゃ受けるなあ

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

引数の説明に入る前に、理解しておいて欲しいポイントを説明していきます。

ポイントは2つです。

  • 変数の定義
  • 変数のスコープ

それでは順番に見ていきましょう。

変数の定義

変数とは、何回も使うデータを名前をつけて格納しておく箱のようなものです。

例を見ていきましょう。

name = "千葉"  # 変数を定義
puts "私の名前は#{name}です。"
puts "出身地は#{name}県です。"

# =>私の名前は千葉です。
# =>出身地は千葉県です。

#{}は「式展開」と呼ばれるもので、文字列の中に変数を代入することができる記述方法です。

 

このように変数を1度定義してしまえば、何回でも利用することが可能になります。

よし
よし
変数には、ローカル変数やインスタンス変数、グローバル変数などいくつか種類がありますが、今回は割愛します!

変数のスコープ

先ほど説明した変数には、使用できる範囲があります。

これを変数のスコープといいます。スコープの範囲外の変数を使おうとするとエラーが起こるので、今後注意していきましょう。

それでは、例を見ながら解説していきます。

 

name = "千葉"  # 変数を定義
puts "私の名前は#{name}です。"

# =>私の名前は千葉です。

上記コードは変数のスコープ内であるため、正常に作動します。

 

それでは、以下の場合はどうでしょうか。

name = "千葉"  # 変数を定義

def person
  puts "私の名前は#{name}です。"
end

person  # メソッドの呼び出し

#=>エラー

この場合だと、変数がスコープの範囲外であるためエラーが起きてしまいます。

 

次に、この記述の場合はどうでしょうか。

name = "千葉"  # 変数を定義

def person
  name = "田中"  # 変数を定義
  puts "私の名前は#{name}です。"
end

person  # メソッドの呼び出し

#=>私の名前は田中です。

「千葉」という変数は使われず、「田中」という変数が用いられていますね。

 

これら3つの例題から分かることは、

メソッド内ではメソッド内で定義した変数しか使えないということです。

よし
よし
ちなみにメソッドとは、「def~end」で囲まれた範囲のことだよ!

 

では、どうすればこの問題を解決できるのでしょうか。

ここで出てくるのが「引数」と呼ばれる考え方です。

引数とは

引数は、メソッド(def~end)に渡すことのできる「値」のことです。

これにより、スコープ外にある変数をメソッドの中で扱うことができます。

 

例を1つ挙げてみます。

def first_name(name)  # 仮引数
  puts "私の名前は#{name}です。"
end

name = "千葉"
first_name(name)  # 本引数

#=>私の名前は千葉です。

 

コードを見てみると、「name = “千葉”」はメソッド外で定義されていますね。

なのにも関わらず、「私の名前は千葉です。」ときちんと表示されているのはなぜでしょうか。

それは、「name」という変数が「first_name」に引数として渡されているからです。

 

図にまとめてみました。

引数の流れ

①まず最初に、「name = “千葉”」と変数を定義しています。

②続いて、そのnameという変数が、本引数としてfirst_nameに代入されています。

③本引数(②のname)の値が、仮引数のnameに渡されます。

④仮引数のnameがputsの中の文に代入されます。

この例からも、スコープ外にある変数をメソッドの中で扱えることが分かりますね。

よし
よし
仮引数と本引数は、このあと説明するよ!

重要ポイント

ここでは、引数を使うにあたり覚えて欲しいことを記述していきます。

ポイントは主に2つです。

  • 引数は「メソッドを呼び出す部分」と「メソッドを定義している部分」両方に書く
  • 仮引数と本引数の名前は一致しなくても良い

 

それぞれ見ていきましょう。

引数は「メソッドを呼び出す部分」と「メソッドを定義している部分」両方に書く

「メソッドを呼び出す部分」は「本引数」、「メソッドを定義している部分」は「仮引数」と呼ばれます。

「def」の直後に記載されているのが仮引数、呼び出し部分に記載されているのが本引数です。

def multi(number)  # 仮引数
  puts number * number
end

puts "数字を入力してください"
number = gets.to_i

multi(number)  # 本引数

 

この2つの引数がきちんと定義されていないと、メソッドに値を受け渡せないので気をつけましょう。

仮引数と本引数の名前は一致しなくても良い

仮引数と本引数の名前が同じである必要はありません。

もう一度例を見てみましょう。

def multi(number)  # 仮引数
  puts number * number
end

puts "数字を入力してください"
number = gets.to_i

multi(number)  # 本引数

 

上記コードでは、ユーザーが入力した値の2乗が正常に出力されています。

 

では以下の場合ではどうでしょうか。

本引数の名前(number)を「value」に変更しました。

def multi(number)  # 仮引数
  puts number * number
end

puts "数字を入力してください"
value = gets.to_i

multi(value)  # 本引数

上記コードでも、同じように正常に作動すると思います。

 

このことからも、仮引数と本引数の名前が同じである必要はないことが分かりますね。

 

 

今回は、プログラミング学習初心者が必ずつまずくと言っても過言ではない「引数」について簡単に説明しました。

まだしっくり来ていない方もいるとは思いますが、徐々に理解を深めていただけたらと思います!