相変わらずエラー問題に苦戦中の もそ。
やさしい先輩たちから「この部分はRubyの復習をしてみるといいかも」というアドバイスをもらい早速Rubyを復習しています。
すると早速、
「げっ、ここって意味がよくわからなくてスルーしたところじゃん...」
となっていたところが出てきました。
Railsを学んだのでなんとな〜く分からんでもないのですが、理解を深めるべくリベンジしました。
今日はそんなRubyの本引数と仮引数について書いていきます。
引数について
まずは引数(ひきすう)についておさらいします。
引数は、プログラムでメソッドなどに渡すことのできる値です。
変数の値には使える範囲が決まっていて、これをスコープと呼びます。
たとえば、あるdef~end内で定義した変数は、ほかのメソッドでそのまま使うことはできません。
引数を使うことでメソッドの外にある変数、つまりスコープ外にある変数をメソッドの中で使うことができます。
そして引数には、メソッドを呼び出す部分に記述する本引数とメソッドを定義している部分に記述する仮引数の2つがあります。
コードを実際に見てみましょう。
① def multi(input)←()内は仮引数
puts input * input
end
② puts "何か数字を入力してください"
input = gets.to_i
③ multi(input)←()内は本引数
こんな感じです。
コードが読み込まれて処理される順番は③→②→①となります。
③と②でスコープを定義して、引数を使うことで①に変数を渡しています。
ひとつポイントなのが、仮引数の名前は本引数と違ってもいいということ。
先ほどのコードの流れは、
③のinputという本メソッド内に②gets.to_iという数値を入れて、①で結果を表示する
というものでした。
これは方程式と同じで、仮の名前に数値を代入しているので、「x=aとして x+1*10=aを解きなさい」という数学の問題と同じような感覚です。
なので先ほどのコードは、
def multi(number)
puts number * number
return number * number
end
puts "何か数字を入力してください"
value = gets.to_i
multi(value)
と表すことができます。
スコープの範囲に注意
次に、このようなコードで考えてみましょう。
① def rename(name)
name = "もそと#{name}"
end
② name = "ポチ"
rename(name)
puts name
このコードを実行すると、出力結果は「ポチ」だけになります。
では、「もそとポチ」と出力するにはどうすればいいでしょうか?
このコードのポイントは、何回も出てきている"name"の記述。
同じ名前が出てきているのですが、実は①と②で中身が違います。
...意味分かんないですよね。私もわからないです。
というわけで、LINEでポチに泣きつきました。

「え、これ外側で名前変えてるだけだからでしょ(即答)」
ここでポチのいう外側は②の部分。
① def rename(name)
name = "もそと#{name}"
end
② name = "ポチ"
rename(name)
puts name
②のコードでは、
「name=ポチとして、rename(ポチ)にします。ではnameを出してください」
と記述しています。
最初にname=ポチと言っているので、ここで指すnameの中身は「ポチ」になります。
では①の部分はどうでしょうか。
「rename(name)を定義します。name=”もそとポチ”です」
よくよく考えてみてください。
これ、②と①でnameで指示しているnameの中身が違いますよね。
なので出力結果を「もそとポチ」にするには、
① def rename(name)
name = "もそと#{name}"
end
② name = "ポチ"
name=rename(name)
puts name
このように記述すればよいのです!なるほど〜!
--
ふわふわしていた引数の考え方が、やっときちんと理解できた...気がします(理解したとは言っていません)
配列と本引数/仮引数はややこしいとポチも言っていたので、ここは焦らず少しずつ理解を深めていこうと思います。
果たして理解できる日は来るのか...もその修行は続く。