Rubyのメソッド
メソッドの分類
・関数的メソッド
・インスタンスメソッド
・クラスメソッド
破壊的なメソッド
レシーバにあたるオブジェクトの値そのものを変更してしまうメソッド
関数的メソッド
レシーバが無いメソッド
# 例
print "あいうえお"
sleep(10)
関数的メソッドを作る
def メソッド名(引数)
処理
end
返り値
def メソッド名(引数)
処理
return 返り値
end
※return を省いても、最後の行(endの上)に記述されている変数がそのまま返り値になる
インスタンスメソッド
オブジェクト(インスタンス)をレシーバとするメソッド
# 例
text.to_i
"10,20,30,40".split(",")
[1,2,3,4].index(2)
1000.integer?
インスタンスメソッドを作る
class Robot
def initialize(name)
@name = name
@x = @y = 0
end
def move(x, y)
@x += x
@y += y
end
def to_s
"#{@name}:#{@x},#{@y}"
end
end
robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
puts robo1 #=> ロボ1号:0,0
robo2.move(10,20) # robo2::move(10,20) とも書ける
puts robo2 #=> ロボ2号:10,20
メソッドの呼び出し制限
・public :どこからでも呼び出せる。デフォルト
・protected:同じクラス、サブクラス内の中だけで呼び出せる。レシーバを付けても呼び出せる
・private :同じクラス、サブクラス内の中だけで呼び出せる。レシーバを付けると呼び出せない
メソッドの呼び出し制限:指定の仕方
# 個別指定
class Test
def pub
puts "public"
end
public :pub
def priv
puts "private"
end
private :priv
end
# まとめて指定
class Test
public # 以降、public
def pub
puts "public"
end
def pub2
puts "public2"
end
private # 以降、private
def priv
puts "private"
end
def priv2
puts "private2"
end
end
privateの例
class Robot
def initialize(name)
@name = name
@x = @y = 0
end
def move(x, y)
@x += x
@y += y
crash if @x < -100 || @x > 100 || @y < -100 || @y > 100
end
private # privateなメソッド
def crash
puts "クラッシュ!"
end
end
robo1 = Robot.new("ロボ1号")
robo1.move(200,100) # エラーは発生しない
robo1.crash # エラーが発生する
組み込みクラスを拡張する
class String
def count_word
a = self.split(/\s+/)
return a.size
end
end
str = "Good morning everyone"
print str.count_word
特異メソッド
個々のオブジェクトに定義することもできる
str = "Ruby入門"
def str.edition(n)
"#{self} 第#{n}版"
end
print str.edition(3) #=> Ruby入門 第3版
※組み込み定数にメソッドを設定する場合などに使える
クラスメソッド
クラスそのものをレシーバとするメソッド
# 例
a = Array.new
f = File.open("some_file")
t = Time.now
クラスメソッドを作る
class Hello
def Hello.hello(name)
print name, "said hello"
end
end
Hello.hello("Bob") #=> Bob said hello ※ Hello::hello("Bob") とも書ける