Ruby~メソッドを使ってみよう~

Ruby

こんにちはkazutoです。今回はメソッドについて解説していきます。

メソッドとは❓

メソッドとは、複数の処理をまとめた部品みたいなものです。他のプログラミング言語では、関数と呼んだりしていますが、Rubyは、メソッドと呼びます。
今まで僕が解説してきたのは、あくまでも、テクニックです。

  • 出力
  • 条件分岐(if文)
  • 変数展開

こちらのテクニックを使って一つのメソッド(部品)を作ってみましょう。

メソッド定義

まず初めにメソッドの定義方法を解説します。

 def メソッド名
 処理内容
 end

メソッド名は、処理内容を抽象化した命名にしましょう。メソッド名を見て処理内容がわかると可読性が向上しますので、メソッド名を命名する際は、処理内容を抽象化した命名にしましょう。

それではメソッドを定義してみましょう。今回はメソッドを使って「自己紹介」をしてみましょう。

def self_introduction
  name="kazuto"
  age=21
  like="scccer"
  puts"初めまして#{name}です"
  puts"年齢は#{age}"
  puts"好きなスポーツは#{like}"
end
  self_introduction()

無事メソッドを定義できました。メソッドを定義しただけだと、メソッド内に記述されている処理は実行されないです。なので「メソッドさん動いてください」と呼び出さないといけないです。

def self_introduction
・・・省略
end
self_introduction()

上記のようにdef~endの外ににメソッド名記述する事で、処理結果をターミナルに出す事ができます。

以上がメソッドの使い方です。・・・と終わらせたい所ですが、上記の記述だと、「kazutoの自己紹介」で終わってしまい、メソッドの特性を最大限、活かせていないです。
本来であれば

  • 3-A組38名の自己紹介
  • 株式会社〇〇新入社員100名の自己紹介

と自己紹介はする際は、単数で終わらず複数人が絡む事の方が多いと思います。
したがって、先程の記述だとメソッドの処理内容が具体的すぎるので、

  • 38個メソッドを作成する
  • 100個メソッドを作成する

一人に1個、自己紹介メソッドを作成してしまうと、処理が複雑になってしまうので、一度、抽象化する必要があります。


メソッドの使う利点は、使い回しがきいて機動力が高いという点です。メソッドの呼び出す際にある部分を付け加えるだけで,とても生産性が高いコードを生み出す事ができます。

ある部分は・・・引数です

続いて引数について解説していきます。

引数とは❓

引数とは、メソッドの補完機能です。メソッドの処理を実行する際に引数を使う事で、足りていない情報を補完してくれます。

引数は2種類あります。

  • 本引数
    メソッドを呼び出す際に記述する。本引数には仮引数に渡したい情報を書く必要がある。
  • 仮引数
    本引数から情報を受け取る。なお仮引数の変数名は何度でも良い。(意味が通じれば)

引数の処理を説明した所で引数を使ったメソッド定義の構文をみてみましょう。

def メソッド名(仮引数)
end
メソッド名(本引数)

少し複雑に見えますが、先程の自己紹介を例を書き換えていきましょう。
なのでもう一度、ソースコードを確認してみましょう。

befor

def self_introduction
  name="kazuto"
  age=21
  like="scccer"
  puts"初めまして#{name}です"
  puts"年齢は#{age}"
  puts"好きなスポーツは#{like}"
end
  self_introduction()

それでは引数があるメソッドに書き換えてみましょう。

after

def self_introduction(name,age,like)
  puts"初めまして#{name}です"
  puts"年齢は#{age}"
  puts"好きなスポーツは#{like}です"
end
  self_introduction("kazuto",21,"soccer")
  self_introduction("kaito",40,"baseball")
  self_introduction("ryu",37,"tennis")

[ターミナル]

本引数に渡したい値を記述する事で、メソッド内で変数を定義する必要がなくなりました。メソッド内で変数を定義しない事により、 「kazutoの自己紹介」ではなく、「複数人の自己紹介」ができるメソッドに生まれ変わりました。

正直、引数の動きが目で追えるようになれば、処理される順番が理解できるようになります。

def メソッド名(②仮引数)
end
メソッド名(①本引数)

まず初めは、番号で引数の動きをマーキングしてください。マーキングができたら、

  • 本引数
  • 仮引数

なのか区別しましょう。
引数は、メソッドを使いこなす上でとても欠かせない機能ですので、まずは、引数の動きを目で追えるレベルになりましょう。

問題:ポケモンの技を繰り出そう

最後に問題です。

ポケモンや技はなんでもよいのでメソッドと引数を使ってみよう。
ポケモンを知らない方は、

  • 名前
     ピカチュウ

  •  10万ボルトでいきましょう。

 解答

def pokemonn(name,*techniques)
  puts "いけ#{name}"
  puts "#{name}は#{technique.sample}を繰り出した"
end
pokemonn("ピカチュウ","10万ボルト","でんこうせっか","アイアンテール","ボルテッカー")
pokemonn("ジュガイン","リーフブレード","リーフストーム","はかいこうせん","ハードプラント")
pokemonn("ゲッコウガ","ハイドロポンプ","いあいぎり","みずしゅりけん","かわらわり")

[ターミナル]

※登場するのはピカチュウのみですsampleメソッドの挙動をご確認頂きたいからです。

以下が解答です。

先程の自己紹介を応用したものですので、新しく出た知識のみ解説していきます。

def pokemonn(name,*techniques)

*techniqueの部分は可変長引数と言います。可変長引数とは、一つの仮引数に対して複数の本引数を設定する事ができます。

まあ実際に*techniquesの中身を確認してみましょう。変数の中身を確認したい際などはputsを使います。

def pokemonn(name,*techniques)
 puts *techniques
end
pokemonn("ピカチュウ","10万ボルト","でんこうせっか","アイアンテール","ボルテッカー")


出力結果は

["10万ボルト", "でんこうせっか", "アイアンテール", "ボルテッカー"]


[]で値を管理する事を配列と言います。変数がただの箱だとすると、配列は、変数や値などを格納して置く、 大きい箱です

※なお配列に関して、解説はしません。

 puts "#{name}は#{technique.sample}を繰り出した"

technique.sampleは、配列techniqueからsampleメソッドを使ってポケモンの技をランダムに取り出しています。
sampleメソッドは、配列の中身をランダムに取り出すという処理を行います。

以上が解説です。だんだんプログラムを組んでいる♫という、感覚になってきませんか❓

  • 出力の仕方(puts)
  • 変数
  • 条件分岐(if文)
  • メソッド
  • 本引数と引数

上記は、これまで僕が解説してきた内容になります。こちらの「5つの知識」があれば、ご自身でプログラムを作成することは、可能です。

下記は、解説はしませんが、「ポケモンの技を繰り出そう」の応用版です。
5つの知識+aの力が必要になってきます。具体的にはメソッドとのコンビネーションです

  • 技を繰り出すメソッド
  • アイテムを使うメソッド
  • 逃げるメソッド

と、選択肢が分かれています。正直、引数の動きになれている方であれば、実行される順番が理解できると思いますが、なれていな方は、プロゲートで、アウトプットして処理の順番を目で追えるようになってからご覧いただいた方が良いです。

挙動を確認したい場合は、ソースコードをコピペしてもらい、ご自身のターミナルで実行してください。

 def techniques(technique)
    puts "#{technique.sample}を繰り出した"
  end


  def items(name)
    puts "[1]キズぐすり"
    puts "[2]凄いキズぐすり"
    puts "[3]モンスターボール"
    puts "[4]戻る"
    puts "#{name}何のアイテムを使う❓"
    input = gets.to_i
    if    input==1
            puts"#{name}にキズぐすりを使った"
            puts"#{name}のHPが40回復した"
    elsif input==2
            puts"#{name}に凄いキズぐすりを使った"
            puts"#{name}のHPが200回復した"
    elsif input==3
            puts"モンスターボールを投げた"
            puts"人のポケモンにボールを投げるのはダメだよ"
    else 
           return puts "戻る"
    end
  end

  def pokemonn(name,*technique)
    puts "いけ#{name}"
      while true do
        puts "[1]技を出す"
        puts "[2]アイテムを使う"
        puts "[3]逃げる"
        puts "#{name}どうする"
        input = gets.to_i
          if  input==1
              techniques(technique)
          elsif input==2
              items(name)
          else
            puts "・・・"
            gets
            if Random.rand(0..1) == 0
       puts "上手く逃げ切れた"
            exit
            else
            puts "逃げられなかった"
        end
      end
    end 
  end


pokemonn("ジュガイン","リーフブレード","リーフストーム","はかいこうせん","ハードプラント")

[ターミナル]

まとめ:~メソッドを使ってみよう~

今回はメソッドについて学びました。メソッドはRubyを学習する上で欠かせない知識です。今回は、一つのメソッドだけを呼び出す処理で終わりました。
しかしレベルが上がるにつれて、メソッド通しのコンビネーションが必要なってきます。なので、メソッドについては、80%程度は、理解をしてください。

ポイントは

  • メソッド
  • 本引数
  • 仮引数

以上kazutoでした。