なぜこの記事を書いたのか
このエラーでRuby内でのルールについて少し教えてもらえたので備忘録代わりに書いてみました。
いつも利用させて貰っているサイトですが、投稿は初なのでスゴイ緊張してます・・・。
記事作成者について
作成時点でプログラミング歴4ヶ月ほどの初心者です。
なので何かしらの勘違いなどがあるかも知れません。
指摘等があればコメント欄までお願いします。
どの様な時にArgumentError: wrong number of arguments (given A, expected B)が発生するか。
結論から言いますと「呼び出し側の引数」(given A)と「メソッド側の仮引数」(expect B)の数のズレから発生します。
#サンプルです(これはgiven,expectの数を合わせてます)
class User
def hoge(num1, num2) ##今回の『メソッド側の引数』(第一仮引数、第二仮引数)
p num1
p num2
end
end
@user = User.new
@user.hoge(1, 2) ##今回の『呼び出し側の引数』(第一引数、第二引数)
##『呼び出し側の引数』とは
「呼び出し側の引数」は今回自分が用意したメソッドに使うために設定した数や文字を指します。
今回なら
@user.hoge(1, 2)
が対象です。
エラー文のgivenはここで設定した引数の数に沿って出力されています。
なので仮にgivenをサンプル通り出力するとなれば2になります。
##「メソッド側の仮引数」とは
「メソッド側の仮引数」とはそのままの意味です。
今回なら
def hoge(num1, num2)
が対象です。
ここに設定している仮引数(num1, num2の所)の数に沿ってexpectの数は出力されます。
なので仮にexpectをサンプル通り出力するとなれば2になります。
=========
メソッドは仮引数を設定している場合、呼び出し側もその数に合わせて出力しないとエラーになります。
この時数が合わない場合に吐き出されるエラーがArgumentError: wrong number of arguments (given A, expected B)になります。
*一応Rubyではの話です。他にもいくつか言語は触ってますが、本当に少しなのでよくわからないです・・・。
##パッと見呼び出し側を省いてるパターン
#サンプルです(これはgiven,expectの数を合わせてます)
def hoge(num)
p num
end
この場合呼び出し側がないように見えます。
Rubyではクラスやモジュール構文に囲まれていない、一番外側の部分のことをトップレベルと呼びます。
この場合のトップレベルはObjectクラスのインスタンスになります。
また、Rubyでは呼び出し側を省略した場合、暗黙的にselfが呼び出し側になります。
そしてこの場合のgivenは1になります。
(自分はこれを知らないせいでわからないエラーがありました・・・。解決まで半日はかかったかも知れません。)
##おわりに
初投稿なので読みづらい・分かりにくい点などあったと思いますがそれは今後の投稿で改善していけたらなと思います。
あと次回からもう少し自分用のラフな感じになるかも知れません。