Slide 1

Slide 1 text

3VCZͷ৽ػೳͱͯ͠ͷ 
 ੩తܕݕࠪͷ։ൃ দຊफଠ࿠

Slide 2

Slide 2 text

দຊफଠ࿠ w !TPVUBSP w 3VCZίϛολ ʙ 
 3VCZͷܕͷ࢓ࣄ w 4RVBSFגࣜձࣾ ʙ 
 ࣾ಺ͷ3VCZϓϩάϥϜʹܕΛ෇͚Δ࢓ࣄ w ത࢜ʢ޻ֶʣ೥ஜ೾େֶ 
 3VCZϓϩάϥϜͷܕΛਪ࿦

Slide 3

Slide 3 text

֓ཁ w 3VCZͷܕղੳػೳ w 3VCZͱܕͷྺ࢙ w ܕݕࠪπʔϧͷ։ൃͷ༷ʑͳଆ໘

Slide 4

Slide 4 text

3VCZͷܕղੳػೳ w ܕΛॻͨ͘Ίͷݴޠ3#4Λఆٛ w ܕఆٛΛॲཧ͢ΔͨΊͷϥΠϒϥϦͱඪ४ϥΠϒϥϦͷܕఆٛΛಉࠝ w ίϛϡχςΟͰϥΠϒϥϦͷܕఆٛΛهड़ͯ͠഑෇͢Δํ๏Λఏڙ w 3#4ؔ࿈ͷπʔϧ͸5ZQF1SPGΛಉࠝ w ܕݕࠪث͸ಉࠝͳ͠

Slide 5

Slide 5 text

# The conference object represents a conference. # # conf = Conference.new("RubyConf 2020") # conf.talks << talk1 # conf.talks << talk2 # class Conference # The name of the conference. attr_reader name: String # Talks of the conference. attr_reader talks: Array[Talk] def initialize: (String name) -> void # Yields all speakers of the conference. # Deduped, and no order guaranteed. def each_speaker: { (Speaker) -> void } -> void | () -> Enumerator[Speaker, void] end

Slide 6

Slide 6 text

Union types Generics untyped type String | Symbol Integer? #== Integer | nil Hash[String, Array[Integer]] Array[String | Integer] def eval: (String) -> untyped Tuple & record [Integer, String] # ݻఆ௕ͷ഑ྻ { id: Integer, name: String } # Ωʔݻఆͷϋογϡ Class/module types Object, Kernel singleton(String), singleton(Array)

Slide 7

Slide 7 text

3#4 w 3VCZίʔυͱ͸ผͷϑΝΠϧʹهड़ w 3VCZͱͷ׬ᘳͳޓ׵ੑ w 3VCZίʔυʹܕ஫ऍΛೖΕͳ͍ͱ͍͏ͩ͜ΘΓ w ͲΜͳ3VCZϓϩάϥϜͰ΋ɺ3#4͕ॻ͚Ε͹ܕ͕ॻ͚Δ

Slide 8

Slide 8 text

class Server < ApplicationRecord validates :name, :length => { :in => 3..30 } validates :uri, :length => { :in => 20..200 } validates :ordinal, :numericality => true, :uniqueness => true end class Server < ApplicationRecord attr_accessor name (): String attr_accessor uri (): String def name_changed: () -> bool def name_change: () -> [String?, String?] def name_will_change: () -> void def name_was: () -> String? def name_previously_changed?: () -> bool def name_previously_was: () -> String? def name_before_last_save: () -> String? def uri_changed: () -> bool def uri_change: () -> [String?, String?]

Slide 9

Slide 9 text

5ZQF1SPG w ૉͷ3VCZϓϩάϥϜΛೖྗͱͯ͠3#4Λੜ੒ w ந৅ղऍʹجͮ͘ΞϧΰϦζϜ w 11-Ͱ঺հ $ typeprof exe/entrypoint

Slide 10

Slide 10 text

HFN@SCT@DPMMFDUJPO w ίϛϡχςΟͰϥΠϒϥϦͷܕΛॻ͍ͯ഑෇ͯ͠΋Β͏৔ॴ w 5ZQF4DSJQUͷ%F fi OJUFMZ5ZQFEɺ1ZUIPOͷ5ZQF4IFE w ແݶʹ͋Δ3VCZϥΠϒϥϦͷܕ৘ใΛॻ͍ͯ΋ΒΘͳ͍ͱ͍͚ͳ͍ IUUQTHJUIVCDPNSVCZHFN@SCT@DPMMFDUJPO

Slide 11

Slide 11 text

3VCZͷܕαϙʔτ w 3#4ͰϥΠϒϥϦͷܕΛॻ͚Δ w HFN@SCT@DPMMFDUJPOͰϥΠϒϥϦͷܕΛ഑෇͢Δ w 5ZQF1SPGͰ3#4Λੜ੒͢Δ w ͳʹ͔ͷπʔϧͰ3VCZϓϩάϥϜͷܕݕࠪΛ͢Δ

Slide 12

Slide 12 text

3VCZͷܕαϙʔτ w 3#4ͰϥΠϒϥϦͷܕΛॻ͚Δ w HFN@SCT@DPMMFDUJPOͰϥΠϒϥϦͷܕΛ഑෇͢Δ w 5ZQF1SPGͰ3#4Λੜ੒͢Δ w ͳʹ͔ͷπʔϧͰ3VCZϓϩάϥϜͷܕݕࠪΛ͢Δ ˡ3VCZ

Slide 13

Slide 13 text

4UFFQ w 3#4ͱ3VCZϓϩάϥϜͱͷ੔߹ੑΛݕࠪ w 3VCZϓϩάϥϜ಺ʹܕ஫ऍΛهࡌ͢Δඞཁ͕͋Δ w 3#4ͰܕΛॻ͘ඞཁ͕͋Δ w 11-Ͱ঺հ

Slide 14

Slide 14 text

ࠓ೔ͷ࿩୊ w 3#4 w HFN@SCT@DPMMFDUJPO w 4UFFQʢ3VCZͰ͸ͳ͍͕ɺ࿩͕ਐ·ͳ͍ͷͰʣ

Slide 15

Slide 15 text

֓ཁ w 3VCZͷܕղੳػೳ w 3VCZͱܕͷྺ࢙ w ܕݕࠪπʔϧͷ։ൃͷ༷ʑͳଆ໘

Slide 16

Slide 16 text

ྺ࢙ w શ෦ܕΛਪ࿦͠Α͏ͱ͢Δάϧʔϓ w ར༻ऀ͕ॻ͍ͨϓϩάϥϜʹܕ஫ऍ͕͋Δ͜ͱΛԾఆ͢Δάϧʔϓ .-ͷܕਪ࿦ʹجͮ͘΋ͷʢদຊ ೆग़ʣ ϑϩʔղੳʹجͮ͘΋ͷʢদຊ ೆग़ʣ %JBNPOECBDL3VCZʢ'VSS 'PTUFSʣ 4UFFQʢদຊʣ 4PSCFU 4USJQF 5ZQF1SPGʢԕ౻ʣ NNDʢࡾӜʣ +VTUJO5JNF4UBUJD5ZQF$IFDLJOHGPS 
 %ZOBNJD-BOHVBHFTʢ3FO 'PTUFSʣ

Slide 17

Slide 17 text

3VCZʹ޲͚ͯ 4UFFQʢদຊʣ 4PSCFU 4USJQF 5ZQF1SPGʢԕ౻ʣ NNDʢࡾӜʣ 3VCZʹܕΛೖΕΔ͜ͱΛએݴ .BU[ 3VCZʹܕݕࠪثΛೖΕͳ͍͜ͱΛܾఆ .BU[ 3#4ͷಋೖΛܾఆ .BU[ 5ZQF1SPGͷಋೖΛܾఆ .BU[ ౦๺େֶిؾ௨৴ݚڀॴڞಉϓϩδΣΫτ SVCZUZQFTNFFUJOH

Slide 18

Slide 18 text

4PSCFU w IUUQTTPSCFUPSH w 3VCZ%4-ͰܕΛॻ͘ class Conference extend T::Sig sig do params(name: String).void end def initialize(name:) @name = name @speakers = T.let([], T::Array[Speaker]) end end

Slide 19

Slide 19 text

4UFFQ w ϓϩάϥϜͷܕ͸ผͷఆٛϑΝΠϧʹॻ͘ w ίϝϯτͰΠϯϥΠϯܕ஫ऍ w ࣮ߦ࣌ͷґଘϥΠϒϥϦͳ͠ class Conference def each_speaker(&block) # @type var speakers: Array[Speak speakers = [] talks.each do |talk| speakers << talk.speaker end speakers.each(&block) end end class Conference def each_speaker: { (Speaker) -> void } -> void end

Slide 20

Slide 20 text

֓ཁ w 3VCZͷܕղੳػೳ w 3VCZͱܕͷྺ࢙ w ܕݕࠪπʔϧͷ։ൃͷ༷ʑͳଆ໘

Slide 21

Slide 21 text

͍Ζ͍Ζͳཁૉ w ܕγεςϜͷઃܭ w αϒλΠϐϯά w ༷ʑͳࠔ೉ w ܕఆٛͷςετ w *%&࿈ܞͷ։ൃ

Slide 22

Slide 22 text

αϒλΠϐϯά w %VDLUZQJOHͱ͍͏֓೦ w ΦϒδΣΫτ͕ಛఆͷΫϥεͰ͋Δ͜ͱΛԾఆ͠ͳ͍ w ϝιου͕͋Ε͹ྑ͍ w ߏ଄త෦෼ܕͷ֓೦ͱ͍ۙ

Slide 23

Slide 23 text

ͥΜͿߏ଄త෦෼ܕͰߦͧ͘💪 w 4USJOHͷdϝιουΛશ෦࠶࣮૷ͨ͠ΫϥεΛ࡞Δ͜ͱ͸ඇݱ࣮త w 3VCZͷ࣮ߦ࣌ͷҙຯͱҰக͠ͳ͍ object.is_a?(String) case json when String ... when Numeric ... when Array ... end

Slide 24

Slide 24 text

΍Ίͨ w ΠϯλϑΣʔεͷΈߏ଄తʹ෦෼ܕΛ൑ఆ w ଞ͸Ϋϥεͷܧঝؔ܎ʹΑͬͯ൑ఆ interface _Appendable def <<: (String) -> void end class String def <<: (String) -> String end class Array[Elem] def <<: (Elem) -> Array[Elem] end class Integer def <<: (Integer) -> Integer end String <: _Appendable # => ✅ Array[String] <: _Appendable # => ✅ Integer <: _Appendable # => 💣

Slide 25

Slide 25 text

༷ʑͳࠔ೉ w ੍໿ɿطଘͷ3VCZίʔυ͕Ͱ͖Δ͚ͩܕݕࠪͰ͖ͯཉ͍͠ w 3VCZʹܕ஫ऍΛೖΕΔ͜ͱ͸Ͱ͖ͳ͍ʢ.BU[ܾఆʣ w ͍Ζ͍ΖͱఘΊΔ͔͠ͳ͔ͬͨ ࣗ༝ͳΦʔόʔϥΠυ $PWBSJBOUͳίϨΫγϣϯ 'MPXTFOTJUJWFͳղੳ ഑ྻͷΞΫηε ϝλϓϩάϥϛϯάʹΑΔఆٛ

Slide 26

Slide 26 text

ࣗ༝ͳΦʔόʔϥΠυ w αϒΫϥε͕উखʹ޷͖ͳҙຯɾܕͰಉ໊ͷϝιουΛఆ͍ٛͯ͠Δ w 0CKFDUTFMFDUͱ"SSBZTFMFDU w 0CKFDUNFUIPEͱ)5513FRVFTUNFUIPE w .PEVMFDMBTT def select: (Array[IO], Array[IO], Array[IO]) -> Array[Array[IO]] def select: () { (Elem) -> top } -> Array[Elem] | () -> Enumerator[Elem, Array[Elem]] 0CKFDUTFMFDU "SSBZTFMFDU

Slide 27

Slide 27 text

ఘΊͨ w ΦʔόʔϥΠυͰϝιουͷܕ͕มΘΔ΋ͷ͸ɺϓϩάϥϚͷ੹೚ w ϝιουͷܕʹΞϊςʔγϣϯΛ෇͚Δ㱺਺͕ଟ͗͢Δ w ࣮ࡍʹ͸໰୊ʹͳΒͳͦ͞͏ʢͲ͏ͤ3VCZͰ࣮ߦͰ͖ͳ͍͔Βʣ def get_method(object) # Object#methodͩͱࢥͬͯݺͼग़͢ object.method(:to_s) end get_method("string") get_method(request) def get_method: (Object) -> void

Slide 28

Slide 28 text

$PWBSJBOUͳίϨΫγϣϯ w "SSBZ<4USJOH>ͱ"SSBZ<0CKFDU>ͷؔ܎ # @type var strings: Array[String] strings = ["foo", "bar"] # @type var objects: Array[Object] objects = strings # ͜ͷ୅ೖΛڐ͔͢ʁ objects.push(3) strings[2] # StringʁIntegerʁ

Slide 29

Slide 29 text

ྑ͍ํ๏͸ͳ͍͔ʁ w +BWBͷΑ͏ʹ΍Δͷ͸Ͳ͏͔ʁ w ಛผͳ(FOFSJDTͷߏจͰɺҾ਺ʹܕม਺͕ग़ͯ͘ΔϝιουΛফ͢ def read_array: (Array[? extends Object]) -> void class Array[Elem] def []: (Integer) -> Elem # ࢒͢ def <<: (Elem) -> Array[Elem] # ফ͢ end

Slide 30

Slide 30 text

class Array[Elem] def find: (Elem) -> Elem? end

Slide 31

Slide 31 text

class Array[Elem] def find: (Elem) -> Elem? end class Array[Elem] def find: (top) -> Elem? end

Slide 32

Slide 32 text

class Array[Elem] def find: (Elem) -> Elem? end class Array[Elem] def find: (top) -> Elem? end # ൺֱؔ਺Λ֎͔Β౉͢ίϨΫγϣϯͩͱμϝͳͷͰ͋Μ·Γ࢖͍ಓ͕ͳͦ͞͏ class Set[Elem] def initialize: { (Elem, Elem) -> Integer } -> void def find: (Elem) -> Elem? end

Slide 33

Slide 33 text

ఘΊͨ w ഑ྻͷཁૉ͸$PWBSJBOUͩͱܾΊͨ w ੈͷதͦ͏͍͏͜ͱʹͳ͍ͬͯΔʢ+BWB΋5ZQF4DSJQU΋ͦ͏ʣ class Array[unchecked out Elem] def <<: (Elem) -> Array[Elem] def pop: () -> Elem? # ͦ΋ͦ΋pop͕μϝ end

Slide 34

Slide 34 text

ܕఆٛͷςετ w ϥΠϒϥϦͷܕΛॻ͍ͯཉ͍͠ w ܕݕࠪثͳ͠ͰܕΛॻ͘ͷ͸ແཧ w 4UFFQΛ࢖͏ͷ͸ͦΕͳΓʹେม w ૊ΈࠐΈϥΠϒϥϦͷιʔείʔυ͸$ w ॻ͍ͨܕͷਖ਼͠͞ΛͳΜͱͳ֬͘ೝ͢Δํ๏͕ඞཁ

Slide 35

Slide 35 text

ܕఆٛͷςετ w ࣮ߦ࣌ݕࠪͱ૊Έ߹ΘͤΔํ๏ʢ૊ΈࠐΈϥΠϒϥϦͰ࢖༻ʣ w 4UFFQΛ࢖͏ํ๏ʢHFN@SCT@DPMMFDUJPOͰ࢖༻ʣ w ґଘ͕͋ΔͷͰɺςετ࣮ߦ͕ࠔ೉ w ظ଴͞ΕΔܕΤϥʔΛอଘ͓͍ͯͯ͠ൺֱ # io.read(0) assert_send_type "(Integer) -> String", io, :read, 0 $ steep check --with-expectations=test.yml

Slide 36

Slide 36 text

*%&࿈ܞͷ։ൃ w 4UFFQͷ*%&࿈ܞػೳ w -BOHVBHF4FSWFS1SPUPDPMΛར༻ w Τϥʔใࠂɺิ׬ɺυΩϡϝϯτද ࣔɺఆٛʹδϟϯϓ w ࣮૷ɾௐ੔ʹແݶʹ͕͔͔࣌ؒΔ

Slide 37

Slide 37 text

ิ׬ͷ࣮૷ w 4UFFQͰ͸3VCZίʔυதͷϝιουݺͼग़͠ɺม਺໊ͳͲͷҰ෦ͷཁૉ ʹ͍ͭͯิ׬Λఏڙ

Slide 38

Slide 38 text

ิ׬ީิͷੜ੒ foo.ba← ͜͜ʂ foo.← ͜͜ʂ w ͜Ε͸ਖ਼͍͠3VCZίʔυ w ܕݕࠪͯ͠ɺΧʔιϧҐஔͷࣜͷܕ ͔Βิ׬ީิΛੜ੒ w ͜Ε͸ߏจΤϥʔ w Χʔιϧͷલ͕ͩͬͨΒɺҰจࣈ ফͯ͠Έͯɺߏจղੳ w ղੳͰ͖ͨΒͦͷܕ৘ใ͔Βิ׬ w ҙ֎ͱྑ͍ײ͡Ͱಈ͘

Slide 39

Slide 39 text

ީิੜ੒଎౓ͷ޲্ w ίʔυ͕௕͍ʢߦͱ͔ʣͱܕݕ͕ࠪ஗͍ʢ໨ඪ͸ඵʣ 
 㱺ؔ܎ͳ͍෦෼Λফ͔ͯ͠Βܕݕࠪ͢Δ class Foo include Bar def foo f # ͜͜Ͱิ׬ end def bar ... end w 4UFFQͷܕݕࠪʹ͸࠷΋಺ଆͷEFG Ҏ֎͸ؔ܎ͳ͍ w ϝιουͷܕ͸3#4͔ΒಡΉ w Ωϟογϡͷঢ়گʹ΋ΑΔ͕ɺ࠷ ѱͰඵ͘Β͍

Slide 40

Slide 40 text

·ͱΊ w 3VCZͷܕղੳػೳͷ঺հ w 3VCZ޲͚ͷܕݕࠪπʔϧ͸࣮༻తͳ΋ͷ͕ग़͖͍ͯͯΔ w ༷ʑͳϓϩάϥϛϯάݴޠͰͷ੍ݶɾଥڠΛͦͷ··Ҿ͖ܧ͍Ͱ͍Δ w ϓϩάϥϚͷೲಘײ͕ࢦ਑ w ܕݕࠪثͷ࣮૷Ҏ֎ʹ΍Δ͜ͱ͕๲େʹ͋Δ

Slide 41

Slide 41 text

w ଟ૬Ϩίʔυܕʹجͮ͘3VCZϓϩάϥϜͷܕਪ࿦ দຊೆग़ w 3VCZϓϩάϥϜͷ੍ޚϑϩʔղੳͱͦͷ݈શੑͷূ໌ দຊೆग़ w 4UBUJD5ZQF*OGFSFODFGPS3VCZ 'VSS"O'PTUFS)JDLT w +VTUJO5JNF4UBUJD5ZQF$IFDLJOHGPS%ZOBNJD-BOHVBHFT 3FO'PTUFS w 1SPHSFTTSFQPSU3VCZʹ͓͚Δ੩తܕղੳͷ࣮ݱʹ޲͚ͯ ԕ౻দຊ্໺ॅҪদຊ w 4PSCFUIUUQTTPSCFUPSH w 4UFFQIUUQTHJUIVCDPNTPVUBSPTUFFQ w 3#4IUUQTHJUIVCDPNSVCZSCT w 5ZQF1SPGIUUQTHJUIVCDPNNBNFUZQFQSPG w HFN@SCT@DPMMFDUJPOIUUQTHJUIVCDPNSVCZHFN@SCT@DPMMFDUJPO