読者です 読者をやめる 読者になる 読者になる

なんちゃってウェブ系エンジニアの備忘録

某IT企業で働くなんちゃってウェブ系エンジニアが技術やデザインなど役に立ちそうなものなどを備忘録として載せていきます

Ruby 自己学習メモ2

先日に引き続き、今回はRubyメソッドを中心に自己学習した内容をまとめておく。

メソッドの定義と呼び出し

Rubyメソッド定義の基本形は他言語とあまり変わらない。
以下の構文でメソッドを定義できます。

def "メソッド名"
  "ここに処理したい文を入れる"
end

メソッド名は大文字で始まる識別子は使えないので留意しておく。
引数を入れるときは以下の構文で引数を定義できます。
引数が複数ある場合にはカンマ区切る。

def メソッド名("引数1", "引数2")
  "ここに処理したい文を入れる"
end

メソッドを呼び出す側で指定した引数を「実引数」、メソッド定義側で記述した引数を「仮引数」と呼ばれ、「仮引数」の後に等号(=) or コロン(:)で何らかの値を代入すると、引数のデフォルト値を指定できます。
デフォルト値は、呼び出し側からその引数を指定しなかった場合にその引数の値として設定されます。

def hello(name = "You")
  puts("#{name}、おはようございます")
end
hello()
#=> You、おはようございます
hello("山田太郎くん")
#=> 山田太郎くん、おはようございます

さらにこんな書き方もできるんですね。
こっちのほうがそれぞれの引数の意味が分かるので、 コードの可読性があって良いかなと思います。

def hello(name: 'You')
  puts("#{name}、おはようございます")
end
hello()
#=> You、おはようございます
hello(name: "山田太郎くん")
#=> 山田太郎くん、おはようございます

キーワード引数

Ruby 2.0.0から新機能としてキーワード引数が追加されました。
引数の順序を気にせず設定できるという大変便利なモノです。

def personal(name: 'unknown', age: '0' , type: 'unknown')
  puts "name=#{name}, age=#{age}, type=#{type}"
end

personal(name: '山田太郎', age: '19' , type: 'men')
#=> name=山田太郎, age=19, type=men
personal(age: '25' , type: 'women', name: '山田花子')
#=> name=山田花子, age=25, type=women
personal(type: 'men' , name: '鈴木一郎', age: '41')
#=> name=鈴木一郎, age=41, type=men

このように引数の順番を変えても、決められた処理の流れに沿って出力することができます。
PHPJavaの場合、メソッドの引数が多く設定されていると、呼び出し元もそれに合わせて引数の順番を設定する必要がありますが、Rubyの場合は不要です。

メソッドのキーワード引数に存在しないキーワードを設定した場合、

personal(ccc: 'men' , aaaa: '鈴木一郎', bbb: '41')
#=> 実行結果
#=> unknown keywords: ccc, aaaa, bbb (ArgumentError)

というエラーが返ってきます。Rubyでは正しいキーワード引数かどうかチェックしてくれるんですね!

ブロック付きメソッド呼び出し

Rubyメソッドはすべて「ブロック」を引数にすることができます。
yieldを使うことによって、ブロック付きメソッド呼出しの時にブロックの中のプログラムの処理を行えます。

def blockTest
  puts "処理開始"
  yield
  puts "処理終了"
end

blockTest {
    puts "ブロック付きメソッドが呼び出されました"
}
#=> 実行結果
#=> 処理開始
#=> ブロック付きメソッドが呼び出されました
#=> 処理終了

block_givenメソッドで、あるメソッドにブロックが与えられていれば、yieldを実行することができます。

def blockTest
  puts "処理開始"
  if block_given?
    yield
  end
  puts "処理終了"
end

# ブロックがない場合
blockTest()
#=> 実行結果
#=> 処理開始
#=> 処理終了

# ブロックがある場合
blockTest {
    puts "ブロック付きメソッドが呼び出されました"
}
#=> 実行結果
#=> 処理開始
#=> ブロック付きメソッドが呼び出されました
#=> 処理終了

次はクラスとモジュールあたりを勉強しておきたいですね。