6. ブロックをオブジェクト晒
hello1 = Proc.new do % ruby sample2.rb
puts "Hello, world" Hello, world
puts "Hello, world" Hello, world
puts "Hello, world" Hello, world
end Hello, world
Hello, world
hello2 = proc do Hello, world
puts "Hello, world" Hello, world
puts "Hello, world" Hello, world
puts "Hello, world" Hello, world
end
hello3 = lambda do
puts "Hello, world"
puts "Hello, world"
puts "Hello, world" 盾hポイント
end ?Proc.newとprocと
hello1.call lambdaの`い
hello2.call
hello3.call ?callで柵び竃される
7. ブロックをv方のように
sum = lambda {|x,y|
x + y % ruby sample3.rb
} 5
puts sum.call(2,3)
盾hポイント
?できることはわかっ
たけど、どういうr
に宴旋かなぁ。
8. ブロック原メソッド柵竃
class Foo
def three(&arg) % ruby sample4.rb
arg.call Hello world
yield Hello world
yield Hello world
end
end
foo=Foo.new
foo.three{ 盾hポイント
puts "Hello world"
} ?gに3指ブロックの嶄をRり卦す
だけのメソッド
?yieldでメソッドの嶄からブロッ
クが柵び竃されるのがキモ
9. ブロックに哈方を局す
class Foo % ruby sample5.rb
def my_logger(filepath,&arg) Hello world
file=open(filepath,"w")
arg.call(file) % cat log.txt
file.close Hello world logging.
end
end
foo=Foo.new
foo.my_logger("log.txt"){|file|
puts "Hello world"
file.write "Hello world logging.n"
}
盾hポイント
?ブロックの嶄で聞えるロガ`もどき
?Rり卦しだけがブロックではないという欹呂
10. Procをメソッドに局す
class Foo class Foo
def my_logger(filepath) def my_logger(filepath)
file=open(filepath,"w") file=open(filepath,"w")
yield(file) yield(file)
file.close file.close
end end
end end
foo=Foo.new foo=Foo.new
script=proc{|file| foo.my_logger("log.txt"){|file|
puts "Hello world" puts "Hello world"
file.write "Hello world logging.n" file.write "Hello world logging.n"
} }
foo.my_logger("log.txt",&script)
% ruby sample6.rb 盾hポイント
Hello world
?ブロックの旗わりにブロックオブジェクトを局
% cat log.txt せる。
Hello world logging.
?&をつける駅勣あり。
12. Symbol#to_proc
マニュアルより
# The same as people.collect { |p| p.name }
people.collect(&:name)
# The same as people.select { |p| p.manager? }.collect { |p| p.salary }
people.select(&:manager?).collect(&:salary)
ソ`スはたったの1佩
class Symbol
def to_proc
Proc.new { |*args| args.shift.__send__(self, *args) }
end
end
とっても宴旋で、庇Lだった
何蛍がDRYで耙しいんだけ
ど、なんでこうなるの殖殖
13. to_procってそもそも
マニュアルより
to_proc メソッドを隔つオブジェクトならば、`&' 俐した哈方として局すことができます
(デフォルトで Proc、Method オブジェクトは慌に to_proc メソッドを隔ちます)。to_proc
はメソッド柵び竃しrにg佩され、Proc オブジェクトを卦すことが豚棋されます。
class Foo
def to_proc
Proc.new {|v| p v} つまりブロックに局すと
end
end to_procの嶄附をブロックの
[1,2,3].each(&Foo.new)
旗わりにg佩する。
=> 1
2
3
14. Symbol#to_procは
class Symbol
def to_proc
Proc.new { |*args| args.shift.__send__(self, *args) }
end
end
==>> user.__send__(:email) のRり卦しになる
よ`くると、args[0]をsendしている。
selfは柵竃し圷なので、和の栽は:emailになる。
User.?nd(:all).map{|user|user.email}
と
User.?nd(:all).map(&:email)
が吉になる。
なんでシンボルを嚥えて、メソッドが
卦って栖るかがわかる。
send(:email)ってな醤栽にuされるよ,辰討里
えておくといいと房います。
modelに鏡徭メソッドを協xしたrも柵び竃せます。