目次へ

6. メソッド

2013/06/09 シナジーマーケティング(株) 松尾 裕美

Rubyにおけるメソッドとは、オブジェクトの振る舞いを定義したものです。
まだ具体的にオブジェクトの説明をしていませんので、ここではオブジェクトを作成せずに利用できる「関数的メソッド」を紹介します。
C言語でいうと「関数」のように扱うことができるメソッドです。

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

メソッドは以下のように定義します。

def メソッド名 (引数名1, 引数名2, ・・・)
  処理
end

メソッド名には英文字、数字、アンダースコア(_)のほかに、?や!も使用できます。
一般的には先頭は英小文字で始まり、単語をアンダーバーで区切ります。

メソッド名のつけ方は自由ですが、このメソッドがどんな操作をするのかが分かるように動詞の名称にした方がいいでしょう。
また、真偽値を返すようなメソッドは、メソッド名の後に「?」をつけるのが一般的です。

メソッド名の後には、仮引数のリストが続きます。
仮引数の名前も自由ですが、どの様な値が来るのかわかるような名詞がいいでしょう。

定義したメソッドを呼びだす場合はメソッド名と実引数を指定します。

メソッド名(実引数)

なお、Rubyではメソッドの定義でもメソッドの呼び出しでも、引数の()は省略可能です。

# coding: windows-31j
def print_name(name)  # 引数の()は省略可能
  puts "名前は#{name}です。"
end

print_name("山田")  # 引数の()は省略可能

■ 実行結果

> ruby method1.rb
名前は山田です。

6.2 戻り値

Rubyのメソッドは、必ず戻り値を返します。
メソッドの戻り値はreturnで指定します。
returnをメソッド内で指定していない場合は、メソッド内の最後の式の結果が戻り値として返されます。

# coding: windows-31j
def join_name(first_name, last_name)
  first_name + last_name # returnがないため、この結果が戻り値として呼び出し元に返る
end

puts join_name("山田", "太郎")

■実行結果

> ruby return.rb
山田太郎

処理の途中で値を返す場合は、returnを明示的に書く必要があります。

# coding: windows-31j
# return文が必要なケース。引数の値が偶数かどうかを判定。
def even?(num)
  if num % 2 == 0
    return true # 処理の途中で戻り値を返すときはreturnが必須
  end
  false # 処理の最後なので、returnを省略可能
end

puts even?(2)
puts even?(3)

■実行結果

> ruby return2.rb
true
false

6.3 引数のデフォルト値

メソッド定義の引数名の後に「=デフォルト値」を記載すると、
引数なしでメソッドを呼び出した場合、デフォルト値が仮引数に入ったとみなし、メソッド内で扱うことができます。1

 # coding: windows-31j
def print_name(name="Anonymous")
  puts "名前は#{name}です。"
end

print_name("山田") # 引数ありで呼び出すと引数が優先
print_name # 引数なしだとデフォルト値が使われる。

■実行結果

> ruby default.rb
名前は山田です。
名前はAnonymousです。

6.4 可変長の引数

仮引数はカンマ区切りで複数指定できます。しかし、メソッドの定義において仮引数の数を固定したくない場合もあります。
その際、メソッド定義の仮引数を「*引数名」とすることで、可変長の引数を配列として受け取ることができるように定義できます。
可変長の引数は、メソッド定義の仮引数リストの最後にひとつだけ定義することができます。

# coding: windows-31j
# 引数の値をすべて加算した結果を返すメソッド
def add(*nums)
  sum = 0
  nums.each do |num|  # 可変長引数numの中を一つずつ加算する
    sum += num
  end
  return sum
end

puts add(1, 2)
puts add(1, 2, 3, 4, 5) 

■実行結果

> ruby variable_length_arg.rb
3
15

1 Ruby1.8まではデフォルト値のある仮引数の後に、デフォルト値のない仮引数を置くことはできませんでしたが、Ruby1.9からは可能となりました。ただし、(name=“Anonymous”, age, address=“Osaka”) のように、デフォルト値のある引数2つの間にデフォルト値のない引数をはさむとエラーになります。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp