メソッド
メソッドとはコードのかたまりに名前をつけたもの。機能をもってるんやで。
Rubyが用意しているものだけでなく自分で作ったメソッドを利用することもできるよ。
定義と呼び出し
メソッドをつくるには下記のようにする。
def メソッド名(引数,引数,...)
メソッドの内容となるプログラム
end
引数のないメソッドの例
def hello
puts "こんにちは "
puts "それではまた"
end
hello
こんにちは
それではまた
メソッド名には半角のアルファベット、数字、アンダースコアを使い、
一文字目は必ず半角アルファベットまたはアンダースコアにすること。
メソッド名の最後には「?」「!」を付けることができる。
スコープについて
スコープとは変数が通用する範囲のこと。
ローカル変数をメソッド内で作成するとそのメソッド内でしかつかえない。
メソッド外に同名の変数があるとそれは別々の変数とみなされる。
またブロックの中でもローカル変数はスコープを持つ。
if式やunless式の中のローカル変数はスコープを持たない。
num = 123
def method
num = 456
puts num
end
method # =>456と表示
puts num # =>123と表示
引数と戻り値
メソッドに引数を持たせるにはメソッド定義で「(」と「)」のあいだに、
引数名をカンマで区切ってならべる。
戻り値を返したいときは、最後に変数名を1行書いておく。
※Rubyではメソッド内で最後に実行された式の値が戻り値になるんやで。
引数と戻り値は詳しく知っといたほうがええで
※参考リンク
【引数やで】
http://www.rubylife.jp/ini/method/index3.html
【戻り値やで】
http://www.rubylife.jp/ini/method/index6.html
引数を2つ持ち、戻り値を返す例。
resultの一行で、resultの値が戻り値になる。
def triangle(base, height)
result = base * height / 2.0
result
end
area = triangle(11,9)
puts "面積は#{area}です。"
↑引数を持つメソッドを呼び出すときには、メソッド名の後ろに引数を並べる。
最後の式の値が戻り値になるから下記のように簡単にもかける。
def triangle(base, height)
result = base * height / 2.0
end
※メソッドを呼び出すときにかっこ()を省略できるよ。
returnとは
メソッドの途中で戻り値を指定してメソッドから抜ける場合につかう。
次の例では引数のどちらかの負の値であったら戻り値がnilになる。
def triangle(base, height)
return nil if base < 0 || height <0
base * height / 2.0
end
area = triangle(-1,9)
puts area
マイナス1が引数に入ってるからnilが返る。
引数のデフォルト値と不定の数の引数
メソッドの引数にはデフォルト値を設定できる。
デフォルト値はメソッドを呼び出したときに引数が設定されていなければ、
代わりに使われる値です。「引数名 = 値」のように記述する。
def putmsg(msg= "こんにちは")
puts msg
end
putmsg
Rubyではメソッド定義で引数名に*をつけると引数の数を不定にできる。
下記の例では、メソッドの引数に*をつけ、メソッドを呼び出すときに引数を並べてる。
するとその引数を要素にした配列messagesがメソッドに渡される例です。
配列の要素が順に出力される(eachメソッド)
def put_messages(*messages)
messages.each { |m| puts m }
end
put_messages "こんにちは", "さようなら"
また次のように*付きの引数の前に普通の引数を置いた時は、
第一引数がfirstに入り、第2引数以降が配列messagesの要素になる。
def put_messages(first, *messages)
puts first
messages.each { |m| puts m }
end
put_messages "こんにちは", "さようなら","また会う日まで"
「?」と「!」が付くメソッド。
Rubyのメソッドには「?」と「!」が付くメソッドがある。これは文法というより慣習。
「?」が付いたメソッドはtrueまたはfalseを返す。
StringクラスやArrayクラスのempty?メソッドは文字列や配列が空かを調べる。
if message.empty? then puts "空です" end
「!」が付いたメソッドはそのオブジェクトの中身を変更する
たとえばStringクラスのchomp!メソッド(末尾の改行を降り除く)など。
「!」が付かない同名のメソッドはオブジェクトを変更せずに新しいオブジェクトを返す。
line.chomp! # lineの末尾の改行を取り除く
line2 = line.chomp # 末尾の改行を取り除いた新しい文字列を返す。
↑lineの内容がずっと変わるのが!つき、一時的(chompの処理が行われたとき)だけ変わるのが!なし。
!なしは一時的だから、line2に代入して変化を残している。
今日はここまでにしとくか。
本記事は下記本の勉強記事です。初学者にとても良い本です。