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でした。