Your SlideShare is downloading. ×
0
Vol.3   Ruby &ActiveSupport  for expert  藤岡岳之(xibbar)
このセッションってxibbarこと藤岡が自分の勉強がてら気づいたことを発表するマニアックなセッションですrubyを詳しくというよりは、Railsのソースを読んでびっくりしたことから派生して、rubyとrailsの仕組みを調べた結果ですhttp:...
今日の内容ブロック、クロージャ、イテレータlambda、procSymbol#to_procの仕組み
ブロックとは          {               puts "Hello, world"               puts "Hello, world"               puts "Hello, world"   ...
イテレータとは?      本来は繰り返しのためのもの      Rubyは繰り返し以外にも使える      そのため、ブロック付きメソッド呼び出しと      いうようになってきて、段々とイテレータと      は呼ばなくなって来ているっぽい...
ブロックをオブジェクト化hello1   = Proc.new do       % ruby   sample2.rb  puts   "Hello, world"      Hello,   world  puts   "Hello, wo...
ブロックを関数のようにsum = lambda {|x,y|  x + y                 % ruby sample3.rb}                       5puts sum.call(2,3)        ...
ブロック付メソッド呼出class Foo  def three(&arg)       % ruby sample4.rb    arg.call            Hello world    yield               He...
ブロックに引数を渡すclass Foo                               % ruby sample5.rb  def my_logger(filepath,&arg)          Hello world    ...
Procをメソッドに渡すclass Foo                                class Foo  def my_logger(filepath)                  def my_logger(fil...
クロージャ                     rubyのブロックはクロージャdef counter_closure            クロージャとは引数以外の変数を実行時の環境では  count = 0  lambda {|n| co...
Symbol#to_procマニュアルより# The same as people.collect { |p| p.name }people.collect(&:name)# The same as people.select { |p| p....
to_procってそもそも? マニュアルよりto_proc メソッドを持つオブジェクトならば、`& 修飾した引数として渡すことができます(デフォルトで Proc、Method オブジェクトは共に to_proc メソッドを持ちます)。to_pr...
Symbol#to_procは class Symbol   def to_proc     Proc.new { |*args| args.shift.__send__(self, *args) }   end end ==>> user._...
おしまいおしまい次回以降予定継続method_missingfind_by_email_and_nameってどういう仕組み?erb、bindings
Upcoming SlideShare
Loading in...5
×

Ruby&Active Support for expert 3

757

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
757
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Ruby&Active Support for expert 3"

  1. 1. Vol.3 Ruby &ActiveSupport for expert 藤岡岳之(xibbar)
  2. 2. このセッションってxibbarこと藤岡が自分の勉強がてら気づいたことを発表するマニアックなセッションですrubyを詳しくというよりは、Railsのソースを読んでびっくりしたことから派生して、rubyとrailsの仕組みを調べた結果ですhttp://xibbar.net/rails_tohoku/ にPDFを置いておきました。
  3. 3. 今日の内容ブロック、クロージャ、イテレータlambda、procSymbol#to_procの仕組み
  4. 4. ブロックとは { puts "Hello, world" puts "Hello, world" puts "Hello, world" }コードの塊 do puts "Hello, world" puts "Hello, world" puts "Hello, world" end
  5. 5. イテレータとは? 本来は繰り返しのためのもの Rubyは繰り返し以外にも使える そのため、ブロック付きメソッド呼び出しと いうようになってきて、段々とイテレータと は呼ばなくなって来ているっぽいイテレータ !イテレータ[1,2,3].each{|n| open("/tmp/sample.txt","w"){|f| puts n f.write("Hello worldn")} }
  6. 6. ブロックをオブジェクト化hello1 = Proc.new do % ruby sample2.rb puts "Hello, world" Hello, world puts "Hello, world" Hello, world puts "Hello, world" Hello, worldend Hello, world Hello, worldhello2 = proc do Hello, world puts "Hello, world" Hello, world puts "Hello, world" Hello, world puts "Hello, world" Hello, worldendhello3 = lambda do puts "Hello, world" puts "Hello, world" puts "Hello, world" 解説ポイントend •Proc.newとprocとhello1.call lambdaの違いhello2.callhello3.call •callで呼び出される
  7. 7. ブロックを関数のようにsum = lambda {|x,y| x + y % ruby sample3.rb} 5puts sum.call(2,3) 解説ポイント •できることはわかっ たけど、どういう時 に便利かなぁ。
  8. 8. ブロック付メソッド呼出class Foo def three(&arg) % ruby sample4.rb arg.call Hello world yield Hello world yield Hello world endendfoo=Foo.newfoo.three{ 解説ポイント puts "Hello world"} •単に3回ブロックの中を繰り返す だけのメソッド •yieldでメソッドの中からブロッ クが呼び出されるのがキモ
  9. 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. endendfoo=Foo.newfoo.my_logger("log.txt"){|file| puts "Hello world" file.write "Hello world logging.n"} 解説ポイント •ブロックの中で使えるロガーもどき •繰り返しだけがブロックではないという気合い
  10. 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 endend endfoo=Foo.new foo=Foo.newscript=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 解説ポイント Hello world •ブロックの代わりにブロックオブジェクトを渡 % cat log.txt せる。 Hello world logging. •&をつける必要あり。
  11. 11. クロージャ rubyのブロックはクロージャdef counter_closure クロージャとは引数以外の変数を実行時の環境では count = 0 lambda {|n| count += n } なく、自身が定義された環境(静的スコープ)におend いて解決する関数のこと。count = 10 やっぱりよくわからんが。。。counter = counter_closureputs counter.call(1) 他の言語の不便さを体感しないと無理かなぁ。puts counter.call(2)puts counter.call(3) コード中に別環境のコードを書く機能があるかどうputs counter.call(4)counter = counter_closure かだと思うんだけど。。。自信なし。でも便利。puts counter.call(5) 解説ポイントputs counter.call(6) •ブロックの中は変数を保持し続けている。% ruby sample8.rb •callされた時に初期化されたりしない。13 •作りなおされると、そこで最初からになる610 •他の言語を知らないから、あんまり突っ込まないで^^;511 •Cだったら関数ポインタで実現するしかないよ なぁ。。。
  12. 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) } endend とっても便利で、冗長だった 部分がDRYで嬉しいんだけ ど、なんでこうなるの???
  13. 13. to_procってそもそも? マニュアルよりto_proc メソッドを持つオブジェクトならば、`& 修飾した引数として渡すことができます(デフォルトで Proc、Method オブジェクトは共に to_proc メソッドを持ちます)。to_proc はメソッド呼び出し時に実行され、Proc オブジェクトを返すことが期待されます。 class Foo def to_proc Proc.new {|v| p v} つまりブロックに渡すと end end to_procの中身をブロックの [1,2,3].each(&Foo.new) 代わりに実行する。 => 1 2 3
  14. 14. Symbol#to_procは class Symbol def to_proc Proc.new { |*args| args.shift.__send__(self, *args) } end end ==>> user.__send__(:email) の繰り返しになるよーく見ると、args[0]をsendしている。selfは呼出し元なので、下の場合は:emailになる。User.find(:all).map{|user|user.email}とUser.find(:all).map(&:email)が等価になる。なんでシンボルを与えて、メソッドが返って来るかがわかる。send(:email)ってな具合に評価されるよ!ってのを覚えておくといいと思います。modelに独自メソッドを定義した時も呼び出せます。
  15. 15. おしまいおしまい次回以降予定継続method_missingfind_by_email_and_nameってどういう仕組み?erb、bindings
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×