【Ruby】ポケモンでRubyのキーワード引数を理解しよう【初心者向け】

本記事はこんな人に向けて書いています。

  • キーワード引数がなぜ必要か分からない人
  • キーワード引数の書き方が分からない人

Rubyの勉強をしていて、『キーワード引数』がたびたび出てきますが、便利そうだけどいまいち使う理由が分からない人もいるのではないでしょうか。

これは多くの参考書では、キーワード引数を使わない場合と比較して、説明されていないことが原因なのかなと思います。

本記事では、キーワード引数を使わずにコードを書くことで、「何だか分かりにくいな〜」と感じてもらってから、キーワード引数について解説していきます。

STEP1 キーワード引数を使わずにメソッドを定義する

まずはキーワード引数を使わずにメソッドを定義していこうと思います。

今回はピカチュウのステータスと攻撃パターンをRubyを使って表現していきます。もし『アクセサ』や『初期設定』のコードが分からない方は、下記記事を読んでもらえると良いと思います。

【Ruby】ややこしいゲッター/セッター/アクセッサーを解説【初心者向け】

では実際に下記コードをみてみましょう。

class Pikachu
  #アクセサの設定
  attr_accessor :name, :hp, :offense, :defense
  #初期設定
  def initialize(name, hp, offense, defense)
    @name = name
    @hp = hp
    @offense = offense
    @defense = defense
  end

  #戦う相手によって攻撃パターンが変わる
  def attack(rival, confident)
    if confident
      puts "#{@name}は余裕そうだ。"
      puts "#{@name}は#{rival}を攻撃した。"
    else
      puts "#{@name}は怖がっている。ぴえん。"
      puts "#{@name}は#{rival}を攻撃しなかった。"
    end
  end
end

#ピカチュウインスタンスを生成
pikachu = Pikachu.new('ピカチュウ', 100, 50, 30)

#ピカチュウが攻撃!!
pikachu.attack('イシツブテ', true)
pikachu.attack('カイリュー', false)

ピカチュウは戦う相手によって、行動パターンが変わるように設定されています。

  • 弱そうな相手(例:イシツブテ)には、普通に攻撃。
  • 格上の相手(例:カイリュー)には、ビビり散らす。

該当コードは下記の通りです。

  #戦う相手によって攻撃パターンが変わる
  def attack(rival, confident)
    if confident
      puts "#{@name}は余裕そうだ。"
      puts "#{@name}は#{rival}を攻撃した。"
    else
      puts "#{@name}は怖がっている。ぴえん。"
      puts "#{@name}は#{rival}を攻撃しなかった。"
    end
  end

attackメソッドは、rivalとconfidentという2つの引数を持ちます。rivalは攻撃相手、confidentはtrueもしくはfalseを持ちます。

メソッドを定義しただけでは、実行されないので、インスタンスに対してメソッドを実行してあげる必要があります。

#ピカチュウが攻撃!!
pikachu.attack('イシツブテ', true)
pikachu.attack('カイリュー', false)

#実行結果 =>
ピカチュウは余裕そうだ。
ピカチュウはイシツブテを攻撃した。
ピカチュウは怖がっている。
ピカチュウはカイリューを攻撃しなかった。

上記コードで想定通りの結果が返ってくるのですが、後から見返した時や他の人がコードを見たときに、

犬

引数のfalseとかtrueって何を表してるか分からん!!

となってしまいます。
attackメソッドを見れば、falseやtrueがconfidentの結果であると分かりますが、コード量が増えると見返すのは大変です。

そこで登場するのが、『キーワード引数』です。

STEP2 キーワード引数を使ってメソッドを定義する

キーワード引数は次のように使用します。

def メソッド名(キーワード引数1:値1,キーワード引数2:値2,...)

では先程のコードをキーワード引数を使って書き直してみます。

class Pikachu
  attr_writer :name, :hp, :offense, :defense
  attr_reader :name, :hp, :offense, :defense
  def initialize(name, hp, offense, defense)
    @name = name
    @hp = hp
    @offense = offense
    @defense = defense
  end

  #キーワード引数を設定
  def attack(rival:rival, confident:confident)
    if confident
      puts "#{@name}は余裕そうだ。"
      puts "#{@name}は#{rival}を攻撃した。"
    else
      puts "#{@name}は怖がっている。ぴえん。"
      puts "#{@name}は#{rival}を攻撃しなかった。"
    end
  end
end

pikachu = Pikachu.new('ピカチュウ', 100, 50, 30)

#キーワード引数を使い書き直す
pikachu.attack(rival:'イシツブテ', confident:true)
pikachu.attack(rival:'カイリュー', confident:false)

このように書くと、attackメソッドを呼び出す際に引数のfalseやtrueが何を表しているか分かりやすいようになりましたね。

キーワード引数は、引数が何を表しているか直感的に分かりやすくする便利なもの。

STEP3 引数をハッシュを使って書き直す

上記コードを『ハッシュ』を使って書き直すことができます。

class Pikachu
  attr_writer :name, :hp, :offense, :defense
  attr_reader :name, :hp, :offense, :defense
  def initialize(name, hp, offense, defense)
    @name = name
    @hp = hp
    @offense = offense
    @defense = defense
  end

  #引数をparamsにまとめる
	def attack(params)
  #paramsの中身をシンボルを使って取り出す
		rival = params[:rival]
		confident = params[:confident]
    if confident
      puts "#{@name}は余裕そうだ。"
      puts "#{@name}は#{rival}を攻撃した。"
    else
      puts "#{@name}は怖がっている。ぴえん。"
      puts "#{@name}は#{rival}を攻撃しなかった。"
    end
  end
end

pikachu = Pikachu.new('ピカチュウ', 100, 50, 30)

#引数はハッシュであり,paramsの中身を指す。
pikachu.attack(rival:'イシツブテ', confident:true)
pikachu.attack(rival:'カイリュー', confident:false)

ハッシュの中身を『シンボル』を使って取り出す方法が分からない方は、下記記事を参考にしてみてくださいね。

【Ruby】ハッシュのシンボルについて解説【初心者向け】

本記事を読んで、キーワード引数の便利さを理解してもらえると嬉しいです!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です