はじめに
- 本記事はRubyでプログラミングを初めてメソッドでいろんな用語が出てきて混乱しているという方が調べる際のヒントになればいいなと思い書きました。
- まずい表現や間違ったことが書いてある場合はコメント等で教えていただけると幸いです。
メソッドってなんだ?
引数、仮引数ってなんだ?
戻り値ってなんだ?、、、
となった人向けに書きました。
私はなりました。
メソッドがプログラミングを始めて、初めのつまづきポイントなのではないかなと思っています。
メソッドのおさらい
まずメソッドのおさらいです。
実際のコードを見てみましょう。
例として、税込価格を計算して返してくれるメソッドを書いてみました。
#################### メソッドを定義############################
# 税込価格を計算するメソッドを定義
def calculate_tax_included_price(price)
#税込価格 tax_included_priceを変数定義
#税込価格の計算結果を代入
tax_included_price = price * 1.1
#returnで戻り値を返す(省略可能)
return tax_included_price
end
#################### メソッドを呼び出す######################
# 支払い額 paymentを変数定義
# calculate_tax_included_price 引数:500 でメソッドを呼び出す。
payment = calculate_tax_included_price(500)
# putsメソッドでpaymentをコンソールに出力
puts payment
#################### 出力結果(コンソール)####################
550.0
- def ~ end のかたまりがメソッドの定義です。 defは定義 definitionの略
- メソッドは呼び出す場所より上で定義する。(Rubyでは上から読み込んでいくため、メソッドは使用される前に定義する必要があるため。)
- returnの一文は省略が可能
メソッドの用語
メソッドに入ってから用語が増えるので、用語を覚えるまでは混乱することが多いと思います。
ここで復習しましょう。
・ メソッド、関数
メソッドと関数という言葉がほとんど同じ意味なのに2通りの呼び方があることが混乱の一因だと思います。
メソッドと関数は厳密には違う意味をもつらしいのですが区別しなくても、あまり困ることはないかなと思います。
Rubyではメソッドの概念しか登場しないそうなのでRubyでは全部メソッドと呼んでおけばOKだと思います。
・ メソッドの定義
def ~ endの中に処理を書いて、呼び出して使えるようにすることです。
・ メソッドを呼び出す、使う
メソッド名を記述する、メソッドに仮引数が定義されている場合は引数を渡すとメソッド内の処理が実行されます。
・ (実)引数、仮引数
どっちがどっちかわからなくなる、引数と仮引数ですがここで復習しましょう。
メソッドを呼び出すところで、渡すのが(実)引数
メソッドを定義したときに書いているのが仮引数です。ちなみに、実引数と仮引数の変数名違う名前でもOKです。ここは混乱するポイントだと思いますが、
実引数が仮引数に改名されると考えるのではなく、
仮引数はメソッドが呼ばれたときに新しく定義される変数で、実引数の値が仮引数にコピーして格納されるとイメージしましょう。
・ 戻り値、返り値
returnの後ろに書いたものが戻り値、返り値として呼び出し元に返されます。
calculate_tax_included_price(500)が550.0という値が格納された変数tax_included_priceに置き換わると考えましょう。Rubyではreturnを省略するとメソッドの最後に記述した式が戻り値として返されます。(今回の例ではreturnを省略しても挙動に変化なし)
・ レシーバ
"こんにちは".size #=> 5
メソッドの実行主体のこと、「 . 」の左側
なぜレシーバという名前かというと、、、
オブジェクト指向では処理をメッセージのやり取りによって行うという考え方があり、メソッドの実行側がこのメッセージの受け取り側と捉えることができます。そのためレシーバと呼ばれます。
だそうです。
・ (カーネル)メソッド、組み込み関数
標準で組み込まれているメソッド・関数
レシーバが不要なメソッド
よく使うputsメソッドなどが含まれます。
・ 公開範囲
Railsprivate
def set_user
@user = User.find(params[:id])
end
public, protected, privateがある。(protectedはあまり使われない) ・public どこからでもアクセス可能、デフォルト設定でされる。 ・private 外部からアクセス不可、隠蔽したいメソッドに利用する。
・ 継承
子クラスは継承親のメソッドを受け継ぎます。
########## 親クラス runメソッドを定義################################ class Car #runメソッド def run puts '走る' end end ######### 子クラス(Carクラスを継承している) メソッドは何も定義していない###### class SuperCar < Car end ####################実行部分################################### #SuperCarクラスのインスタンス化を行う。 supercar = SuperCar.new #SuperCarではrunメソッドを定義していないがCarクラスのrunメソッドを使用できる。 supercar.run ####################出力結果(コンソール)########################## 走る
・ オーバーライド
子クラスで親クラスで定義されたものと同じ名前を使ってメソッドを新しく定義しなおすことです。
########## 親クラス runメソッドを定義################################ class Car #runメソッド def run puts '走る' end end #########子クラス(Carクラスを継承している) runメソッドをオーバーライドしている#### class SuperCar < Car #runメソッドをオーバーライド(上書き) def run puts '超速く走る' end end ####################実行部分################################### #SuperCarクラスのインスタンス化を行う。 supercar = SuperCar.new #SuperCarのオーバーライドされたrunメソッドを使用する。 supercar.run ####################出力結果(コンソール)########################## 超速く走る
・ オーバーロード、多重定義
Rubyにはない概念ですが、オーバーライドと字が似ているので誰しもが最新は混乱すると思います。
どういうものかというとメソッドの名前は同じで引数のデータ型や引数の個数を変えたものを複数定義するというものです 。
同じメソッド名が使えるのでメソッドを使うときに楽になる、ポリモーフィズムが実現できると言ったメリットがあります。