STUDY MEMO

学習のメモ書き

<Ruby> メソッド

メソッドとクラス

クラスやメソッド、オブジェクトは以下のように定義されることが多い。

クラス:設計図
オブジェクト:実体
メソッド:振る舞い

イメージとしては
クラス(設計図)内にメソッド(振る舞い)があって、

オブジェクト(実体)はクラス(設計図)を元に作られたもの


または、別の例えだと、クラスを生物の種族と捉えるというのもよくある。
クラス(猫)は、なく、寝るなどの基本的な行動(振る舞い)があり、
または猫はそれぞれ個体がある。


メソッド

メソッドは前述した通り、クラスに定義されたオブジェクトの振る舞いのことを指す。
rubyの組み込みライブラリに設定されているメソッドはリファレンスマニュアルに記載されているが、自分でも設定することができる。
メソッドの解説中ではとりあえず、クラスは横に置いておいて、メソッドの話のみ言及する。
メソッドの定義では、def ... endの内側に欲しい振る舞いが返り値として返される処理を記載する。

def number
  puts 1*2
end
#  => :number

number # => 2

定義式にシンボルが返ってくる?
リファレンスマニュアルのメソッド項目の部分で、メソッド定義式はメソッド名をシンボルにしたオブジェクトを返す、と記載されている。

シンボルって?
Rubyの内側では、数字で管理すると処理速度が早くなるため、メソッド名や変数名、定数名などさまざまな名称を「整数」で管理している。 その整数を表現したものをシンボルと呼ばれ、対応する文字列と1 : 1で対応するラベルのようなもの。 immutable(変更不可)であり、同値ならば必ず同一になる。


戻り値

戻り値とは、メソッドを呼び出した時、メソッド処理の結果情報が呼び出し元に渡すデータ(オブジェクト)のこと。
キャッチボールで例えると、自分(呼び出し元)が相手(メソッド)に投げたら(引数)、戻ってくる(戻り値)といったイメージ。 Image from Gyazo 複数のオブジェクトを返したい場合は、配列へ入れて一つにまとめるなどする。


引数

引数とは、メソッド名の横に記載される、呼び出し元からメソッドへ渡すデータ(オブジェクト)のこと。
メソッド名の横に(変数)の形で定義し、そこへ引数が入れられて、メソッド内でその変数を使用して計算を行う。

def number(a)
  puts 1*a
end
#  => :number

number(3)
#  => 3

Image from Gyazo 2つ以上の引数を持つメソッドは、引数の後に,(カンマ)を入れて変数を記載する。
特に指定がない場合は、引数の記載された順番(今回だとa=2, b=5)に代入される。

def number(a,b)
  p a*b
end
#  => :number

number(2,5)
#  =>  10

引数の数が異なるとエラーになる。

number(2)

#  =>  ArgumentError (wrong number of arguments (given 1, expected 2))


※引数の()の省略は可能だが、曖昧だと判断されたらエラーになるので適宜設定を考えること。


メソッドを途中で終了する

returnをメソッド内に入れると、それ以下の処理が実行されず終了し、return前の処理結果が戻り値として返される。

def like(catlike)
  print "犬いいよね。"
  return
  print "でも猫の方が好き。"
end

like  #  =>  犬いいよね

条件式を入れると以下のようになる。
今回は犬派か猫派かの会話をしている。

def like(catlike)
  print "犬いいよね。"
  unless catlike
    return
  end
  print "でも猫の方が好き。"
end

#猫好き
like(true)
#  =>  犬いいよね。でも猫の方が好き。

#猫好きじゃない
like(false)
#  =>  犬いいよね。


引数のデフォルト値

引数のデフォルト値は引数に=で値を入れることで設定できる。
何も指定がなければデフォルト値、引数があれば任意の引数が渡される。

def clothe(item = "シャツ")
  print "#{item}"
end

clothe  #  =>  シャツ
clothe("スカート")  #  =>  スカート


キーワード引数

通常引数は順番通り渡されるが、キーワード引数を設定すると任意の引数を渡すことができる。

def clothe(item, size)
  print "#{item}#{size}サイズ"
end

clothe("スカート", "M")  #  =>  スカートのMサイズ
clothe("M","スカート")  #  =>  Mのスカートサイズ

これをキーワードをもとに引数の渡す先を指定する。
キーワード引数の指定はメソッド名(引数名:)で指定でき、メソッドの呼び出し元は(引数名: 引数)を記載することで渡せるようになる。

def clothe(item:, size:)
  print "#{item}#{size}サイズ"
end

clothe(item: "スカート", size: "M")  #  =>  スカートのMサイズ

# デフォルトの設定
def clothe(item: "スカート", size:)
  print "#{item}#{size}サイズ"
end

clothe(size: "M")  #  =>  スカートのMサイズ

キーワード引数について
ruby3.0から仕様変更があるので、使用する際は確認すること。


ローカル変数とスコープ

ローカル変数のスコープとは、そのローカル変数の適応できる適応範囲のことを指す。 定義された行から、その変数が定義されたブロック、メソッド定義、またはクラス/モジュール定義の終わりまでがスコープになる。


参考文献

NEWS for Ruby 2.7.0 (Ruby 3.0.0 リファレンスマニュアル)

ゼロからわかる Ruby 超入門 (かんたんIT基礎講座) | 五十嵐 邦明, 松岡 浩平 |本 | 通販 | Amazon