際際滷

際際滷Share a Scribd company logo
Vol.3
   Ruby &
ActiveSupport
  for expert
  儲埓岻xibbar
このセッションって

xibbarこと儲が徭蛍の茶がてら櫃鼎
たことをk燕するマニアックなセッションで
す
rubyをしくというよりは、Railsのソ`ス
をiんでびっくりしたことから塗伏して、
rubyとrailsの碧Mみを{べたY惚です
http://xibbar.net/rails_tohoku/ にPDF
を崔いておきました。
書晩の坪否



ブロック、クロ`ジャ、イテレ`タ
lambda、proc
Symbol#to_procの碧Mみ
ブロックとは
          {
               puts "Hello, world"
               puts "Hello, world"
               puts "Hello, world"
          }
コ`ドのK     do
            puts "Hello, world"
            puts "Hello, world"
            puts "Hello, world"
          end
イテレ`タとは

      云栖はRり卦しのためのもの
      RubyはRり卦し參翌にも聞える
      そのため、ブロック原きメソッド柵び竃しと
      いうようになってきて、粁?とイテレ`タと
      は柵ばなくなって栖ているっぽい

イテレ`タ              .ぅ謄讒`タ
[1,2,3].each{|n|   open("/tmp/sample.txt","w"){|f|
  puts n             f.write("Hello worldn")
}                  }
ブロックをオブジェクト晒
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で柵び竃される
ブロックをv方のように

sum = lambda {|x,y|
  x + y                 % ruby sample3.rb
}                       5

puts sum.call(2,3)




                       盾hポイント
                      ?できることはわかっ
                      たけど、どういうr
                      に宴旋かなぁ。
ブロック原メソッド柵竃

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でメソッドの嶄からブロッ
                       クが柵び竃されるのがキモ
ブロックに哈方を局す

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り卦しだけがブロックではないという欹呂
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.
                         ?&をつける駅勣あり。
クロ`ジャ
                     rubyのブロックはクロ`ジャ
def counter_closure            クロ`ジャとは哈方參翌の篳をg佩rのh廠では
  count = 0
  lambda {|n| count += n }     なく、徭附が協xされたh廠┥乙張好芥`プにお
end                            いて盾Qするv方のこと。
count = 10                     やっぱりよくわからんが。。。
counter = counter_closure
puts counter.call(1)           麿の冱Zの音宴さを悶湖しないとo尖かなぁ。
puts counter.call(2)
puts counter.call(3)           コ`ド嶄にeh廠のコ`ドをくC嬬があるかどう
puts counter.call(4)
counter = counter_closure
                               かだと房うんだけど。。。徭佚なし。でも宴旋。
puts counter.call(5)                   盾hポイント
puts counter.call(6)
                             ?ブロックの嶄は篳を隠隔しAけている。
% ruby sample8.rb            ?callされたrに兜豚晒されたりしない。
1
3                            ?恬りなおされると、そこで恷兜からになる
6
10                           ?麿の冱Zを岑らないから、あんまり融っzまないで^^;
5
11                           ?Cだったらv方ポインタでgFするしかないよ
                             なぁ。。。
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で耙しいんだけ
             ど、なんでこうなるの殖殖
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
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も柵び竃せます。
おしまい


おしまい
肝指參週嚠協
@A
method_missing
?nd_by_email_and_nameってどういう碧Mみ
erb、bindings

More Related Content

Ruby&Active Support for expert 3

  • 1. Vol.3 Ruby & ActiveSupport for expert 儲埓岻xibbar
  • 4. ブロックとは { puts "Hello, world" puts "Hello, world" puts "Hello, world" } コ`ドのK do puts "Hello, world" puts "Hello, world" puts "Hello, world" end
  • 5. イテレ`タとは 云栖はRり卦しのためのもの RubyはRり卦し參翌にも聞える そのため、ブロック原きメソッド柵び竃しと いうようになってきて、粁?とイテレ`タと は柵ばなくなって栖ているっぽい イテレ`タ .ぅ謄讒`タ [1,2,3].each{|n| open("/tmp/sample.txt","w"){|f| puts n f.write("Hello worldn") } }
  • 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. ?&をつける駅勣あり。
  • 11. クロ`ジャ rubyのブロックはクロ`ジャ def counter_closure クロ`ジャとは哈方參翌の篳をg佩rのh廠では count = 0 lambda {|n| count += n } なく、徭附が協xされたh廠┥乙張好芥`プにお end いて盾Qするv方のこと。 count = 10 やっぱりよくわからんが。。。 counter = counter_closure puts counter.call(1) 麿の冱Zの音宴さを悶湖しないとo尖かなぁ。 puts counter.call(2) puts counter.call(3) コ`ド嶄にeh廠のコ`ドをくC嬬があるかどう puts counter.call(4) counter = counter_closure かだと房うんだけど。。。徭佚なし。でも宴旋。 puts counter.call(5) 盾hポイント puts counter.call(6) ?ブロックの嶄は篳を隠隔しAけている。 % ruby sample8.rb ?callされたrに兜豚晒されたりしない。 1 3 ?恬りなおされると、そこで恷兜からになる 6 10 ?麿の冱Zを岑らないから、あんまり融っzまないで^^; 5 11 ?Cだったらv方ポインタでgFするしかないよ なぁ。。。
  • 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も柵び竃せます。