SlideShare uma empresa Scribd logo
1 de 15
Baixar para ler offline
Vol.3
   Ruby &
ActiveSupport
  for expert
  藤岡岳之(xibbar)
このセッションって

xibbarこと藤岡が自分の勉強がてら気づい
たことを発表するマニアックなセッションで
す
rubyを詳しくというよりは、Railsのソース
を読んでびっくりしたことから派生して、
rubyとrailsの仕組みを調べた結果です
http://xibbar.net/rails_tohoku/ にPDF
を置いておきました。
今日の内容



ブロック、クロージャ、イテレータ
lambda、proc
Symbol#to_procの仕組み
ブロックとは
          {
               puts "Hello, world"
               puts "Hello, world"
               puts "Hello, world"
          }
コードの塊     do
            puts "Hello, world"
            puts "Hello, world"
            puts "Hello, world"
          end
イテレータとは?

      本来は繰り返しのためのもの
      Rubyは繰り返し以外にも使える
      そのため、ブロック付きメソッド呼び出しと
      いうようになってきて、段々とイテレータと
      は呼ばなくなって来ているっぽい

イテレータ              !イテレータ
[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"      解説ポイント
end                       •Proc.newとprocと
hello1.call                lambdaの違い
hello2.call
hello3.call               •callで呼び出される
ブロックを関数のように

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

puts sum.call(2,3)




                       解説ポイント
                      •できることはわかっ
                      たけど、どういう時
                      に便利かなぁ。
ブロック付メソッド呼出

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{                     解説ポイント
  puts "Hello world"
}                      •単に3回ブロックの中を繰り返す
                       だけのメソッド
                       •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"
}



                                        解説ポイント
                     •ブロックの中で使えるロガーもどき
                     •繰り返しだけがブロックではないという気合い
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                     解説ポイント
  Hello world
                         •ブロックの代わりにブロックオブジェクトを渡
  % cat log.txt          せる。
  Hello world logging.
                         •&をつける必要あり。
クロージャ
                     rubyのブロックはクロージャ
def counter_closure            クロージャとは引数以外の変数を実行時の環境では
  count = 0
  lambda {|n| count += n }     なく、自身が定義された環境(静的スコープ)にお
end                            いて解決する関数のこと。
count = 10                     やっぱりよくわからんが。。。
counter = counter_closure
puts 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された時に初期化されたりしない。
1
3                            •作りなおされると、そこで最初からになる
6
10                           •他の言語を知らないから、あんまり突っ込まないで^^;
5
11                           •Cだったら関数ポインタで実現するしかないよ
                             なぁ。。。
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

             とっても便利で、冗長だった
              部分がDRYで嬉しいんだけ
             ど、なんでこうなるの???
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
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に独自メソッドを定義した時も呼び出せます。
おしまい


おしまい
次回以降予定
継続
method_missing
find_by_email_and_nameってどういう仕組み?
erb、bindings

Mais conteúdo relacionado

Mais procurados

Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話outerinside
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる5t111111
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説Ryuji Iwata
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能についてshigeki_ohtsu
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Kenta USAMI
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
Openjdk 入門してみた話
Openjdk 入門してみた話Openjdk 入門してみた話
Openjdk 入門してみた話Tokuhiro Matsuno
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idiomsfimbul
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSLKent Ohashi
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 

Mais procurados (20)

Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Unix
UnixUnix
Unix
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
Openjdk 入門してみた話
Openjdk 入門してみた話Openjdk 入門してみた話
Openjdk 入門してみた話
 
Hachiojipm41
Hachiojipm41Hachiojipm41
Hachiojipm41
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idioms
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Clojureで作る"simple"なDSL
Clojureで作る"simple"なDSLClojureで作る"simple"なDSL
Clojureで作る"simple"なDSL
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 

Destaque

acts_asを使ってみよう
acts_asを使ってみようacts_asを使ってみよう
acts_asを使ってみようxibbar
 
仙台Ruby会議02 Pdf
仙台Ruby会議02 Pdf仙台Ruby会議02 Pdf
仙台Ruby会議02 Pdfxibbar
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Prxibbar
 
地域振興論2009
地域振興論2009地域振興論2009
地域振興論2009xibbar
 
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法xibbar
 
Ruby and ActiveSupport for expart
Ruby and ActiveSupport for expartRuby and ActiveSupport for expart
Ruby and ActiveSupport for expartxibbar
 
Tohoku Open Source Conference 2008
Tohoku Open Source Conference 2008Tohoku Open Source Conference 2008
Tohoku Open Source Conference 2008xibbar
 

Destaque (7)

acts_asを使ってみよう
acts_asを使ってみようacts_asを使ってみよう
acts_asを使ってみよう
 
仙台Ruby会議02 Pdf
仙台Ruby会議02 Pdf仙台Ruby会議02 Pdf
仙台Ruby会議02 Pdf
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Pr
 
地域振興論2009
地域振興論2009地域振興論2009
地域振興論2009
 
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
tDiaryなどのレガシーウェブアプリをRuby1.9で動かす方法
 
Ruby and ActiveSupport for expart
Ruby and ActiveSupport for expartRuby and ActiveSupport for expart
Ruby and ActiveSupport for expart
 
Tohoku Open Source Conference 2008
Tohoku Open Source Conference 2008Tohoku Open Source Conference 2008
Tohoku Open Source Conference 2008
 

Semelhante a Ruby&Active Support for expert 3

フィボナッチ数列の作り方
フィボナッチ数列の作り方フィボナッチ数列の作り方
フィボナッチ数列の作り方Tomoya Kawanishi
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリMasahiro Tomita
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogrammingMasanori Kado
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像Kiwamu Okabe
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)Kazuhiro Nishiyama
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009Muhammad Ali
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
PythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたPythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたkwatch
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめSatoshi imai
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto studyNaoya Inada
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 

Semelhante a Ruby&Active Support for expert 3 (20)

フィボナッチ数列の作り方
フィボナッチ数列の作り方フィボナッチ数列の作り方
フィボナッチ数列の作り方
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
あらためてPHP5.3
あらためてPHP5.3あらためてPHP5.3
あらためてPHP5.3
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリ
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
PythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたPythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみた
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto study
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 

Mais de xibbar

エンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
エンジニア志望だったのにRuby社長をしてよかったと思う5つのことエンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
エンジニア志望だったのにRuby社長をしてよかったと思う5つのことxibbar
 
札幌Ruby会議03のlt
札幌Ruby会議03のlt札幌Ruby会議03のlt
札幌Ruby会議03のltxibbar
 
Fukushima.rb#00
Fukushima.rb#00Fukushima.rb#00
Fukushima.rb#00xibbar
 
栃木Ruby会議02 Lt途中まで
栃木Ruby会議02 Lt途中まで栃木Ruby会議02 Lt途中まで
栃木Ruby会議02 Lt途中までxibbar
 
1000speakers仙台
1000speakers仙台1000speakers仙台
1000speakers仙台xibbar
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Setxibbar
 
RubyとActive Support for expert 2
RubyとActive Support for expert 2RubyとActive Support for expert 2
RubyとActive Support for expert 2xibbar
 

Mais de xibbar (7)

エンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
エンジニア志望だったのにRuby社長をしてよかったと思う5つのことエンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
エンジニア志望だったのにRuby社長をしてよかったと思う5つのこと
 
札幌Ruby会議03のlt
札幌Ruby会議03のlt札幌Ruby会議03のlt
札幌Ruby会議03のlt
 
Fukushima.rb#00
Fukushima.rb#00Fukushima.rb#00
Fukushima.rb#00
 
栃木Ruby会議02 Lt途中まで
栃木Ruby会議02 Lt途中まで栃木Ruby会議02 Lt途中まで
栃木Ruby会議02 Lt途中まで
 
1000speakers仙台
1000speakers仙台1000speakers仙台
1000speakers仙台
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Set
 
RubyとActive Support for expert 2
RubyとActive Support for expert 2RubyとActive Support for expert 2
RubyとActive Support for expert 2
 

Último

情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 

Último (11)

情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 

Ruby&Active Support for expert 3

  • 1. Vol.3 Ruby & ActiveSupport for expert 藤岡岳之(xibbar)
  • 4. ブロックとは { puts "Hello, world" puts "Hello, world" puts "Hello, world" } コードの塊 do puts "Hello, world" puts "Hello, world" puts "Hello, world" end
  • 5. イテレータとは? 本来は繰り返しのためのもの Rubyは繰り返し以外にも使える そのため、ブロック付きメソッド呼び出しと いうようになってきて、段々とイテレータと は呼ばなくなって来ているっぽい イテレータ !イテレータ [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" 解説ポイント end •Proc.newとprocと hello1.call lambdaの違い hello2.call hello3.call •callで呼び出される
  • 7. ブロックを関数のように sum = lambda {|x,y| x + y % ruby sample3.rb } 5 puts sum.call(2,3) 解説ポイント •できることはわかっ たけど、どういう時 に便利かなぁ。
  • 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{ 解説ポイント puts "Hello world" } •単に3回ブロックの中を繰り返す だけのメソッド •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" } 解説ポイント •ブロックの中で使えるロガーもどき •繰り返しだけがブロックではないという気合い
  • 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 解説ポイント Hello world •ブロックの代わりにブロックオブジェクトを渡 % cat log.txt せる。 Hello world logging. •&をつける必要あり。
  • 11. クロージャ rubyのブロックはクロージャ def counter_closure クロージャとは引数以外の変数を実行時の環境では count = 0 lambda {|n| count += n } なく、自身が定義された環境(静的スコープ)にお end いて解決する関数のこと。 count = 10 やっぱりよくわからんが。。。 counter = counter_closure puts 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された時に初期化されたりしない。 1 3 •作りなおされると、そこで最初からになる 6 10 •他の言語を知らないから、あんまり突っ込まないで^^; 5 11 •Cだったら関数ポインタで実現するしかないよ なぁ。。。
  • 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 とっても便利で、冗長だった 部分がDRYで嬉しいんだけ ど、なんでこうなるの???
  • 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. 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に独自メソッドを定義した時も呼び出せます。