Slide 1

Slide 1 text

Procͷεεϝ ৿௩ɹਅ೥(@sanfrecce_osaka)
 ฏ੒Rubyձٞ01 #heiseirubykaigi

Slide 2

Slide 2 text

ࣗݾ঺հ ➤ ৿௩ ਅ೥ ➤ GitHub: @sanfrecce-osaka ➤ Twitter: @sanfrecce_osaka ➤ Qiita: @sanfrecce_osaka ➤ 9݄: େࡕ → ொా ➤ גࣜձࣾϥάβΠΞ ➤ ত࿨63೥ੜ·Ε ➤ ࣮࣭ฏ੒੎

Slide 3

Slide 3 text

ձࣾ঺հ ➤ RubyɾRailsͷडୗ։ൃձࣾ ➤ at ொా ➤ ձࣾͷۙลͰ΋Ո௞͕͍҆ʂ ➤ ະܦݧ͔ΒͰ΋2ϲ݄ͷݚम༗ ➤ We are hiring!

Slide 4

Slide 4 text

Thanks ➤ ਆށ.rb & ੢࿬.rbͷϝϯόʔ

Slide 5

Slide 5 text

ͳͥProcͷ࿩ʁ

Slide 6

Slide 6 text

ॻ͖ํͷखஈΛ ଟ͍࣋ͬͯ͘Δ 
 બ୒ࢶ͕ଟ͍
 
 ৔߹ʹԠͨ͡
 ॻ͖ํΛબ୒Ͱ͖Δ
 
 ίʔυͷ඼্࣭͕͕Δʂ

Slide 7

Slide 7 text

※஫ ࠓͷ͸͋͘·Ͱ ݸਓతݟղͰ͢

Slide 8

Slide 8 text

Proc ࢖ͬͯ·͔͢ʁ

Slide 9

Slide 9 text

஌Βͳ͍͏ͪʹ࢖͍ͬͯΔProc class ArticlesController < ApplicationController before_action -> do redirect_to root_path end def index # ॲཧ end end -> do redirect_to root_path end ͜ͷ෦෼΋Proc(lambda)

Slide 10

Slide 10 text

࣮͸Α͘ݟΔ͜ͷॻ͖ํ΋ɾɾɾ map(&:to_s)

Slide 11

Slide 11 text

&म০ࢠ ➤ ࣮Ҿ਺ͷ࠷ޙͰ&Λ෇͚Δͱto_proc͕ݺ͹ΕΔ ➤ to_procΛ࣋ͭΫϥε ➤ Proc(lambda)ɾMethodɾSymbolɾHash ➤ ֤ΫϥεͰڍಈ͕ҟͳΔ

Slide 12

Slide 12 text

Proc#to_proc

Slide 13

Slide 13 text

Proc#to_procͷRuby࣮૷ͷΠϝʔδ class Proc def to_proc self end end

Slide 14

Slide 14 text

Proc#to _procΛ࢖༻ͨ͠ྫͷ঺հ(ཁ݅) ૹΒΕ͖ͯͨ
 ࣸਅΛม׵ ҹ࡮σʔλ(16ຕͷγʔϧ) ݩը૾

Slide 15

Slide 15 text

MiniMagick::ToolΛ࢖༻ͯ͠ը૾Ճ޻ # ը૾Λճసͤ͞Δॲཧ MiniMagick::Tool::Convert.new do |command| command << 'images/input.jpg' command.merge! %w[-rotate 90] command << 'images/output.jpg' end # ը૾Λ੾ΓऔΔॲཧ MiniMagick::Tool::Convert.new do |command| command << 'images/input.jpg' command.merge! %w(-crop 900x500+170+0) command << 'images/output.jpg' end

Slide 16

Slide 16 text

ίϚϯυ૊Έཱͯ෦෼ΛϞδϡʔϧʹ੾Γग़͠ def build_command -> (command) do args.each { |arg| add_arg(command, arg) } end end def add_arg(command, arg) command.send(merge_method(arg), arg) end def merge_method(arg) arg.kind_of?(Array) ? :merge! : :<< end ProcΛฦ͢ϝιουΛఆٛ

Slide 17

Slide 17 text

Ճ޻ॲཧBeforeAfter MiniMagick::Tool::Convert.new do |command| command << 'images/input.jpg' command.merge! %W[-rotate 90] command << 'images/output.jpg' end def execute MiniMagick::Tool::Convert.new(&build_command) end def args [input_path, rotate_arg, output_path] end def rotate_arg %w[-rotate 90] end ໋໊ʹΑΓ
 ԿΛ͢Δͷ͔Ұ໨ͰΘ͔Δ Before After

Slide 18

Slide 18 text

࠷ऴతͳݺͼग़͠ଆ [ Cutting.new, Rotation.new, Montage.new, Positioning.new ].each(&:execute)

Slide 19

Slide 19 text

Method#to_proc

Slide 20

Slide 20 text

Method#to_procͷRuby࣮૷(̘࣮૷ͷίϝϯτ͔ΒҾ༻) class Method def to_proc lambda do |*_1| self.call(*_1) end end end શͯͷ
 ϒϩοΫҾ਺Λ ࣮ߦ͢Δϝιουͷ Ҿ਺ʹల։ શͯͷ
 ϒϩοΫҾ਺Λ
 splatͰ഑ྻʹ ϝιουΛ࣮ߦ

Slide 21

Slide 21 text

Method#to_procΛ࢖ͬͯΈΔ [8, 0, 10] .map .with_index(1, &Report.method(:new)) # => [#,…] [8, 0, 10] .map .with_index(1) do |*args| Report.new(*args) end <= ೔෇ॱʹۈ຿࣌ؒΛ֨ೲͨ͠഑ྻ ex. ϧʔϓ1ճ໨: Report.new(8, 1)

Slide 22

Slide 22 text

Method#to_proc͕ศརͳ৔໘ ➤ ໋໊ʹ࢖͏໊લΛઅ໿͍ͨ͠ͱ͖ ➤ ໋໊ʹ͔͔Δ࣌ؒɾ࿑ྗΛݮΒ͍ͨ͠ͱ͖ ➤ ໋໊͢Δࡍ͸ͳΔ΂͖ͪ͘Μͱ໊ͨ͠લΛ͚͍ͭͨ৔߹ ➤ ex. είʔϓ͕୹͍ͱͯ͠΋1จࣈͷ໊લ͸࢖͍ͨ͘ͳ͍

Slide 23

Slide 23 text

Method#to_procͷ࢖͍Έͪ title = titles.find { |title| … } Article.new(title) titles .find { |title| … } .then(&Article.method(:new))

Slide 24

Slide 24 text

ʲRuby2.7.0ʙʳϝιουࢀরԋࢉࢠ titles .find { |title| … } .then(&Article.method(:new)) titles .find { |title| … } .then(&Article.:new) .:method_name == .method(:method_name)

Slide 25

Slide 25 text

revert͞Ε·ͨ͠(ůЧ`)ŢŞŢŞ

Slide 26

Slide 26 text

ʲRuby2.7.0ʙʳNumbered Parameters titles .find { |title| … } .then(&Article.method(:new)) titles .find { |title| … } .then { Article.new(_1) } _1ͰୈҰϒϩοΫҾ਺ΛࢀরͰ͖Δ

Slide 27

Slide 27 text

ʲTIPSʳprintσόοάͰͷར༻ users .reject(&:admin?) .tap(&method(:p)) .reject(&:retired?)

Slide 28

Slide 28 text

Symbol#to_proc

Slide 29

Slide 29 text

Symbol#to_procͷRuby࣮૷ class Symbol def to_proc proc do |_1, *_2| _1.method(self) .call(*_2) end end end ࠷ॳͷϒϩοΫҾ਺
 ͕Ϩγʔό &෇͖Ͱ౉ͨ͠
 Symbolͷ໊લͷ
 ϝιουΛ࣮ߦ 2൪໨Ҏ߱ͷ
 ϒϩοΫҾ਺͸
 splatͰ഑ྻʹ 2൪໨Ҏ߱ͷ
 ϒϩοΫҾ਺Λ
 ࣮ߦ͢Δϝιουͷ Ҿ਺ʹల։

Slide 30

Slide 30 text

Symbol#to_procΛ࢖ͬͯΈΔ [10, 20, 30] .map .with_index(1, &:+) # => [11, 22, 33] [10, 20, 30] .map .with_index(1) do |n1, *n2| n1.+(*n2) end ex. ϧʔϓ1ճ໨: 10.+(1)

Slide 31

Slide 31 text

ͲΜͳ৔໘Ͱ ࢖͑Δʁ

Slide 32

Slide 32 text

(ƅшƅ)ɾɾɾ

Slide 33

Slide 33 text

ʢʀ^ω^ʣ

Slide 34

Slide 34 text

Symbol#to_procʹҾ਺Λෳ਺౉͢ػձ͸΄ͱΜͲͳͦ͞͏ ➤ ༗ޮͳϢʔεέʔε͕͋·Γͳ͍ ➤ ୈೋϒϩοΫҾ਺ʹ഑ྻ౉ͯ͠ల։ɾɾɾ͸Ͱ͖ͳ͍ ➤ ϒϩοΫҾ਺ʹ౉ͬͨ࣌఺ͰҰ౓഑ྻʹ֨ೲ͞ΕΔͨΊ ➤ EnumeratorΛ֦ுͨ͠Βϫϯνϟϯ͋ΔՄೳੑ

Slide 35

Slide 35 text

Hash#to_proc

Slide 36

Slide 36 text

Hash#to_procͷRuby࣮૷ͷΠϝʔδ class Hash def to_proc proc do |_1| self[_1] end end end

Slide 37

Slide 37 text

Hash#to_procΛ࢖ͬͯΈΔ generations = { S: 'ত࿨', H: 'ฏ੒', R: 'ྩ࿨' } %i(S H).map(&generations) # => ['ত࿨', 'ฏ੒'] %i(S H).map { |key| generations[key] }

Slide 38

Slide 38 text

ͲΜͳͱ͖ʹ خ͍͠ͷʁ

Slide 39

Slide 39 text

JSON΍CSVΛ ѻ͏ࡍʹ ͨ·ʹศར

Slide 40

Slide 40 text

࣌ؒ಺ʹ͓͞·Βͳͯ͘ল͍ͨ΋ͷ ➤ ಠࣗʹto_procΛఆٛ ➤ ؔ਺߹੒(Proc#>>ɺProc#<<) ➤ ϝιουͷҾ਺ʹϒϩοΫ(proc)Λ౉͢ ➤ Enumerator::Lazy

Slide 41

Slide 41 text

ଓ͖͸QiitaͰʂ

Slide 42

Slide 42 text

ʲࢀߟʳ̘࣮૷ͰͷఆٛՕॴ(2019/12/14࣌఺) ➤ Ҿ਺ͷύʔεՕॴ ➤ parse.y#L2422 ➤ Proc#to_proc ➤ proc.c#L1408 ➤ Symbol#to_proc ➤ proc.c#L791 ➤ Method#to_proc ➤ proc.c#L2880 ➤ Hash#to_proc ➤ proc.c#L2880 ➤ ஫ɿઙ͍Cͷ஌ࣝͰಡΜͩͷͰఆٛՕॴҧ͏͔΋

Slide 43

Slide 43 text

࠷ޙʹ ➤ ࠓճ঺հͨ͠ςΫχοΫ͸޷͖ݏ͍͕෼͔ΕΔ ➤ ਓʹΑͬͯಡΈ΍͍͢ɾಡΈਏ͍ͷج४͕ҟͳΔ ➤ νʔϜͰೝࣝ͋ΘͤΛ͓ͯ͘͠ͱྑͦ͞͏

Slide 44

Slide 44 text

͝ਗ਼ௌ ͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ