Help us understand the problem. What is going on with this article?

もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜本引数と仮引数の違いってなに?〜

More than 1 year has passed since last update.

相変わらずエラー問題に苦戦中の もそ。
やさしい先輩たちから「この部分は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でポチに泣きつきました。

無題1160 3.jpeg

「え、これ外側で名前変えてるだけだからでしょ(即答)」

ここでポチのいう外側は②の部分。

 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

このように記述すればよいのです!なるほど〜!

--
ふわふわしていた引数の考え方が、やっときちんと理解できた...気がします(理解したとは言っていません)
配列と本引数/仮引数はややこしいとポチも言っていたので、ここは焦らず少しずつ理解を深めていこうと思います。
果たして理解できる日は来るのか...もその修行は続く。

moso
プログラミングを学ぶカエルです。絵を描きます。 フロントエンドを目指しているのになぜかサーバーサイドを勉強しています。 HTML/CSS/JavaScript/Ruby/Ruby on Rails/PHP/Laravel/UIUXデザイン
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした