メソッド

Rubyでオブジェクトを操作するには、オブジェクトのメソッドを呼び出します。本チュートリアルのデータ型ではRubyの処理系が予め用意しているものを紹介しました。ここではユーザが独自にメソッドを定義する方法について説明します。


メソッドの定義

次の構文でメソッドを定義します。
def メソッド名 (引数, …)
#処理
end

引数にはデフォルト値を「引数=値」の形で設定することもできます。メソッド内で最後に評価された式の値がメソッドの戻り値になります。returnを使用して戻り値を明示することもできます。
プログラム中で定義したメソッドを実行するには、「メソッド名(引数)」と記述します。引数を囲むカッコは省略することもできます。

<method1.rb>
#メソッドの定義
def hello(name = "Ruby")
message = "Hello, " + name + ".\n"
puts message
end

#メソッドを使った処理
if ARGV.size != 1
hello() #デフォルト値でメソッドを呼び出す
else
hello(ARGV[0])
end

<実行結果>
C:\ruby>ruby method1.rb
Hello, Ruby.

C:\ruby>ruby method1.rb Suzuki
Hello, Suzuki.


<method2.rb>
def sum(a, b)
return a + b
end

if ARGV.size != 2
puts "enter 2 numbers"
else
puts sum(ARGV[0].to_i, ARGV[1].to_i)
end

<実行結果>
C:\ruby>ruby method2.rb 3 5
8


引数の数が呼び出しごとに変わるときは、最後の引数の前に「*」を付けることで、最後の引数のみ可変長にすることができます。最後の引数はメソッド内で配列として参照します。
また複数の引数をもつメソッドに対して、引数を配列として渡すことで、一度に引数を渡すことができます。この場合、メソッドを呼ぶ際に、引数の前に「*」を付けます。

<method3.rb>
def sum1(*nums)
result = 0
nums.each {|num|
result += num
}
return result
end

def sum2(a, b, c)
return a + b + c
end

#引数の数はいくつでも可
puts "sum1:"
puts sum1(1,3,5)
puts sum1(10,20,30,40,50)

#引数の列を配列で渡すことができる
puts "sum2:"
nums = [1, 2, 3]
puts sum2(*nums)

<実行結果>
C:\ruby>ruby method3.rb
sum1:
9
150
sum2:
6


Rubyには複数の変数に対して、一度の代入で値を入れることができます。下記のように、変数と代入する値をそれぞれカンマで区切って指定します。

irb(main):001:0> a, b = 100, "Ruby"
=> [100, "Ruby"]
irb(main):002:0> p a
100
=> 100
irb(main):003:0> p b
"Ruby"
=> "Ruby"


これを使って、メソッドの複数の戻り値を返すこともできます。

<method4.rb>
def plus_minus(a, b)
return a + b, a - b
end

plus, minus = plus_minus(100, 50)
puts "plus = #{plus}"
puts "minus = #{minus}"

<実行結果>
C:\ruby>ruby method4.rb
plus = 150
minus = 50



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

メソッドにはデータだけでなく、処理を渡すこともできます。メソッドを呼び出す際に、メソッドの後ろに「{ }」または「do~end」で囲んだブロックを指定し、ブロック内に処理を記述します。
呼び出されたメソッド内部では、ブロックの処理がyieldの位置で実行されます。yieldに引数を渡すと、その引数はブロック冒頭の「| |」で囲まれた変数に代入することができます。

<method5.rb>
def block_test1
if block_given?        #ブロックが与えられたかをチェック
yield         #与えられたブロックを実行
else
puts "no block"
end
end

def block_test2(last)
for i in 0..last
yield i          #iを引数としてブロックを実行
end
end

puts "---block_test1"
block_test1{puts "Ruby"} #ブロックありの呼び出し
block_test1 #ブロックなしの呼び出し
puts "---block_test2"
block_test2(5){|x| puts x} #引数とブロック付のメソッド呼び出し

<実行結果>
C:\ruby>ruby method5.rb
---block_test1
Ruby
no block
---block_test2
0
1
2
3
4
5



メソッド内の変数とスコープ

メソッド内で宣言された変数をメソッド外で代入や参照することははできません。同様に、メソッド外で宣言された変数もメソッド内で代入・参照することはできません。

<method6.rb>
def foo
a = 100
end

foo
puts a

<実行結果>
C:\ruby>ruby method6.rb
method6.rb:6:in `<main>': undefined local variable or method
`a' for main:Object (NameError)


<method7.rb>
a = 100

def foo
puts a
end

foo

<実行結果>
C:\ruby>ruby method7.rb
method7.rb:4:in `foo': undefined local variable or method
`a' for main:Object (NameError)
from method7.rb:7:in `<main>'


しかし変数名の先頭に「$」を付けてグローバル変数として宣言すると、同じプログラム内ではどこでも代入・参照することができます。
<method8.rb>
def foo
$a = 100
end

foo
puts $a

<実行結果>
C:\ruby>ruby method8.rb
100


続いて、Rubyのクラスの概要について説明します。