Slide 1

Slide 1 text

Re:valua t ion https://fril.jp/ L ead & Delight User F irst Ownership Fail Smart 3VCZͷύλʔϯϚονϯάͰ༡ΜͰΈͨ

Slide 2

Slide 2 text

3BLVNB4FSWJDF"QQMJDBUJPO %FWFMPQNFOU(SPVQ 3BLVUFO JOD   ࣗݾ঺հ ؛

Slide 3

Slide 3 text

IUUQTTQFBLFSEFDLDPNL@UTKQBUUFSONBUDIJOHOFXGFBUVSFJOSVCZEPU ຊՈΛಡΜͩ΄͏͕ΑͬΆͲ͍͍ͧʂʂʂʂʂʂʂ

Slide 4

Slide 4 text

SCFOWJOTUBMMEFW

Slide 5

Slide 5 text

XBSOJOH1BUUFSONBUDIJOHJTFYQFSJNFOUBM  BOEUIFCFIBWJPSNBZDIBOHFJOGVUVSF WFSTJPOTPG3VCZ

Slide 6

Slide 6 text

  ύλʔϯϚονϯάͬͯʁ

Slide 7

Slide 7 text

DBTFPCK
 JO\^ ͍ Μ DBTFʹଓ͘ΦϒδΣΫτ͕ JOʹ༩͑ͨύλʔϯʹϚον͢Δ৔߹ɺ ॲཧΛߦ͏͜ͱ͕Ͱ͖Δ

Slide 8

Slide 8 text

  ύλʔϯϚονͷछྨ͸छྨ  ஋ͦͷ΋ͷʹϚονͤ͞Δ 7BMVFQBUUFSO   ม਺ʹΞαΠϯͤ͞Δ 7BSJBCMFQBUUFSO   ͲΕ͔ʹϚονͤ͞Δʢ"MUFSOBUJWFQBUUFSOʣ  Ϛονͱม਺ʹΞαΠϯΛಉ࣌ʹߦ͏ "TQBUUFSO   "SSBZͷܗʹϚονͤ͞Δ "SSBZQBUUFSO   )BTIͷܗʹϚονͤ͞Δ )BTIQBUUFSO

Slide 9

Slide 9 text

  ஋ͦͷ΋ͷʹϚονͤ͞Δ 7BMVFQBUUFSO ϝιου͕USVFΛฦ͢ͳΒϚον͢Δɻ DBTFXIFOͱ͍ͬ͠ΐɻ 1 case 0 2 in 0 3 in -1..1 4 in Integer 5 end

Slide 10

Slide 10 text

  ม਺ʹΞαΠϯͤ͞Δ 7BSJBCMFQBUUFSO ม਺ʹΞαΠϯͤ͞Δ͜ͱ͕Ͱ͖Δ 1 case 0 2 in a 3 p a #=> 0 4 end 1 case [0, 1] 2 in [_, _] 3 :reachable 4 end ม਺໊Λ@ʹ͢ΔͱɺϚον͸͢Δ͚Ͳ
 ΞαΠϯ͸͠ͳ͍ 1 a = 0 2 case 1 3 in ^a # means `in 0` 4 :unreachable 5 end #=> NoMatchingPatternError ͢Ͱʹଘࡏ͢Δม਺ͷ஋Λ࢖͍͍ͨ৔߹͸ɺ
 ?Λ࢖͏ &MJYJSͷQJOԋࢉࢠ

Slide 11

Slide 11 text

  ͲΕ͔ʹϚονͤ͞Δʢ"MUFSOBUJWFQBUUFSOʣ c 03 Ͱෳ਺ఆٛͯ͠ɺ ͍ͣΕ͔͕ͰUSVFΛฦͤ͹ Ϛον͢Δ 1 ['a', 1, :c].each do |value| 2 case value 3 in /a/ | 1 | Symbol 4 puts :reachable 5 end 6 end

Slide 12

Slide 12 text

  Ϛονͱม਺ʹΞαΠϯΛಉ࣌ʹߦ͏ "TQBUUFSO Ϛονͨ͠ม਺Λ ଞͷม਺ʹΞαΠϯ͢Δ ʜ 1 ['a', 1, :c].each do |value| 2 case value 3 in /a/ | 1 | Symbol => bbb 4 puts bbb 5 end 6 end

Slide 13

Slide 13 text

  "SSBZͷܗʹϚονͤ͞Δ "SSBZQBUUFSO ࡶʹݴ͏ͱʮܗʯΛ߹ΘͤΔͱɺϚον͢Δɻ TQMBU Ͱ࢒Γͷม਺ΛϚονͤͨ͞Γ΋Ͱ͖Δ 1 case [0, [1, 2]] 2 in [0, [1, _] => a] 3 p a #=> [1, 2] 4 end 2 in [0, [1, _] => a] ͔͠΋ɺͦͷͱ͖
 "TύλʔϯͰ஋ͷҰ෦ΛऔΓग़ͨ͠Γɺ Ϛονͨ͠஋ΛࣺͯͨΓͰ͖Δɻ
 ʢ͜͜·ͰͷύλʔϯͷԠ༻ʣ

Slide 14

Slide 14 text

  "SSBZͷܗʹϚονͤ͞Δ "SSBZQBUUFSO 1 Color = Struct.new(:red, :green, :blue) do 2 def deconstruct 3 puts '`deconstruct` is called' 4 to_a # [red, green, blue] 5 end 6 end 7 8 class Color2 < Color; end 9 10 case Color[0, 10, 0] 11 in Color2[0, a, 0] # not called because type is different 12 puts "Color2" 13 in [0, a, 0] 14 puts "Matched with array: #{a}" # => 10 15 in Color[0, a, 0] # => `deconstruct` is called 16 puts "Matched with Color: #{a}" # => 10 17 end ಺෦తʹ͸ɺEFDPOTUSVDU͕ ฦ͢"SSBZΦϒδΣΫτΛݩ ʹύλʔϯϚον͍ͤͯ͞ Δɻ ͳͷͰɺಠࣗͷ$PMPSΫϥε ͷΦϒδΣΫτΛύλʔϯ Ϛονͤ͞Δ͜ͱ΋Մೳʂ ͍͢͝ʂ ຊՈεϥΠυͰ͸ɺߏจ໦Λॲཧ͢Δ3VCZ7."CTUSBDU4ZOUBY5SFF/PEFʹEFDPOTUSVDUΛ࣮૷ͨ͠Β 1PXFS"TTFSU͕࣮૷Ͱ͖ͪΌ͏తͳ͜ͱ͕ॻ͍ͯ͋Δʢཧղෆ଍ʣ

Slide 15

Slide 15 text

  )BTIͷܗʹϚονͤ͞Δ )BTIQBUUFSO ࡶʹݴ͏ͱʮܗʯΛ߹ΘͤΔͱϚον͢Δɻ EPVCMFTQMBU Ͱ࢒Γͷม਺ΛϚονͤͨ͞Γ΋Ͱ͖Δ ͱ͍͏͜ͱ͸ɺEFDPOTUSVDUతͳԿ͔ΛΦϦδφϧΫϥε Ͱ࣮૷͢Ε͹ʜ 1 case {a: 1, b: 2, c: 3} 2 in {a: 1, b: b} 3 p "reached! b is #{b}" 4 end

Slide 16

Slide 16 text

  ̒)BTIͷܗʹϚονͤ͞Δ )BTIQBUUFSO 1 Person = Struct.new(:name, :age) do 2 def deconstruct_keys(keys) 3 puts "`deconstruct_keys` is called with keys #{keys}" 4 { name: name } 5 end 6 end 7 8 case Person.new('a', 30) 9 in name: # => `deconstruct_keys` is called with keys [:name] 10 p name # => 'a' 11 end ಺෦తʹ͸ɺ EFDPOTUSVDU@LFZTͷLFZʹରԠ ͢ΔLFZWBMVFΛؚΉϋογϡ ͕ฦΕ͹Ϛονͤ͞Δ͜ͱ΋Ͱ ͖Δɻ ͳͷͰɺಠࣗͷ1FSTPOΫϥεͷ ΦϒδΣΫτΛύλʔϯϚον ͤ͞Δ͜ͱ΋Մೳʂ ͍͢͝ʂ \OBNFOBNF^ͷ4ZOUBY4VHBS

Slide 17

Slide 17 text

  ࢖͍ॴ

Slide 18

Slide 18 text

  ࢖͍ॴ ύοͱࢥ͍͍ͭͨͷ͸ʜ w େྔσʔλΛ3VCZͰಡΈࠐΜͰɺύλʔϯʹϚονͨ͠ σʔλ͚ͩॲཧूܭ͢Δ w ಡΈࠐΈݩZBNM DTW KTPO BOZ/P42- w ͦ΋ͦ΋42-΍(SBQI2-ͳͲͰΫΤϦͰߜΓࠐΊΕ͹ۤ ࿑͸ͳ͍ w Ͳ͜Β΁ΜͰ࢖͑ΔͩΖ͏

Slide 19

Slide 19 text

Slide 20

Slide 20 text

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