143 Views
October 19, 23
スライド概要
2023/10/15 に "千歳ゆるい勉強会vol.3" で発表した資料を、当日に話す中で違和感を覚えたあたりを中心に見直した資料です。Swift 5.9 の新機能「所有権」で自分が混乱した体験をもとに、どこを押さえれば修得できるものなのか、そんな着目点で要所を整理してみています。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 152 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
4XJGUͷ৽ػೳ 4XJGUॴ༗ݖཁఘ ۽୩༑ !FT@LVNBHBJ ઍࡀΏΔ͍ษڧձWPM
▶︎ ▶︎ ▶︎ ۽୩༑ 5PNPIJSP,VNBHBJ 4XJGU͕ޠݴΈ ΈΜͳͰָ͠Ήษڧձ͕Έ ϓϩάϥϛϯάͷָ͠͞Λ͍͖͍͑ͯͨ
4XJGUͷ৽ػೳ 4XJGUॴ༗ݖ
ংນ
4XJGUॴ༗ݖɺษڧձͷࡐʹͨ͠ɻ ࣜגձࣾΏΊΈ͞Μͷࣾษڧձͱͯ͠։࠵͍ͯ͠Δ ͍͞͠4XJGUษڧձʹͯʮ4XJGUॴ༗ݖʯΛࡐʹͨ͠ɻ िճ!ΦϯϥΠϯ#一般参加も大歓迎
▶︎ ▶︎ ▶︎ ▶︎ ॴ༗ݖͷ৽ػೳ ϓϩύςΟʔʹॴ༗͕ݖಋೖ͞Εͨ w म০ࢠͷՃ consuming borrowing inout ͷѻ͍ํΛࢦఆՄೳʹͳͬͨ w ԋࢉࢠͷՃ copy consume ෳͰ͖ͳ͍͕ܕಋೖ͞Εͨ w ઐ༻ϓϩτίϧͷՃ ~Copyable ্ʹه͏͞·͟·ͳޠݴϧʔϧͷՃ
▶︎ ▶︎ ▶︎ ॴ༗ݖͷ۩ମྫ Ҿͷॴ༗ݖΛࢦఆՄೳʹ func something(value: Int) func something(value: borrowing Int) func something(value: consuming Int) ͷ໌ࣔෳফඅ͕Մೳʹ let value = copy otherValue let value = consume otherValue ෳͰ͖ͳ͍ߏମ͕ఆٛՄೳʹ struct Value : ~Copyable { }
▶︎ ▶︎ ▶︎ ॴ༗ݖͷमಘΛࢼΈΔ ॴ༗ݖʁʢݴ༿͕ͷͷ͍͠ʣ w 3VTU͋ʹޠݴΔ֓೦ͷ༌ೖΒ͍͠ʁ w $ ޠݴͷNPWFӈลࢀরͱଊ͑Εྑͦ͞͏ʁ CPSSPXJOHआ༻ͰɺDPOTVNJOHফඅʁ ෳͰ͖ͳ͍͕͑ܕΔΑ͏ʹͳͬͨʁ
Ώͬ͘Γཧ͍͚ͯ͠ɺͦ͜·Ͱ͘͠ͳͦ͞͏
ͱࢥͬͨͷͰ͕͢
ࠞཚͨ͠ɻ ཧղͰ͖ͨͭΓʹͳͬͯɺ ࣮ࡍʹ͏ͱ͔Βͳ͘ͳͬͯɺ·ͨௐͯͷ܁Γฦ͠ɻ
ཧղΛཧ͠ͳ͓ͯ͠Έͨɻ ࠶J1IPOF%FW4BQQPSPr+VOF ͰࡐʹཱͯͯΈͯ ⋯ ͦΕͰ·ͩ·ͩࠞཚଓ͍ͯ
▶︎ ▶︎ ▶︎ ▶︎ Ͳ͕͍͜͠ͷͩΖ͏ɻ ॴ༗ݴ͏͍ͱݖ༿ʹनΘΕ͕ͪ आ༻ͱফඅͷҙຯ͔Γ͍͢ͷʹ ͦͷΠϝʔδͱҧ͏ಈ࡞ΛͤݟΒΕͯށ͏ ෳͰ͖ͳ͍ʹܕΘ͞Ε͕ͪ w ػۄೳͱࢥ͍͖Ռͯ͠ͳ͘ະʢδΣωϦΫεʹະରԠʣ Ճ͞Εͨޠݴϧʔϧͷमಘ͕ࠔ
4XJGUͷ৽ػೳ 4XJGUॴ༗ݖཁఘ
▶︎ ▶︎ 4XJGUॴ༗ݖ ཁఘ Λѻ͏ͱ͖ʹෳ͠ͳ͍खஈ͕༻ҙ͞Εͨ ͦͷཧͷͨΊʹɺʹՃใ͕ఴ͑ΒΕͨˡॴ༗ݖ ͜ͷʜ w आ༻͍ͯ͠Δʁ w ফඅͷରʁ w ͦΕͱैདྷ௨Γʹෳʁ ͜ΕΒ͕ॴ༗ݖ ˞ ෳλΠϛϯάΛϓϩάϥϚʔ͕ਤΕΔ͢Δͷ͕త
Ҏ্
4XJGUॴ༗ݖ ·ͱΊ
▶︎ ▶︎ ·ͱΊ ॴ༗ݖͷత ͷෳΛઌૹΓͰ͖Δखஈͷఏڙ ෆඞཁͳෳΛճආͯ͠ɺॲཧޮͷ্ΛਤΕΔ
·ͱΊ มͷॴ༗ݖ ˙ ී௨ʹఆٛͨ͠ͱ͖ʜ ˙ ෳෆՄͳܕͷͱ͖ʜ var value: Int var value: Value ैདྷ௨Γͷෳର ফඅͷରෳͰ͖ͳ͍ ෳෆՄͳͱܕʜ ~Copyableʹ४ܕͨ͠ڌ ˞ ैདྷ௨Γͷͷɺैདྷ௨Γʹಈ͘ʢॏཁʣ struct Value : ~Copyable { ⋯ }
▶︎ ▶︎ ·ͱΊ Ҿͷॴ༗ݖ Ҿͷॴ༗ݖɺؔͰͷѻ͍Λٴݴ ݺग़ʹݩؔ༩͠ͳ͍ func exec(value: Int) { } ͜ͷͰvalue ैདྷ௨Γѻ͑Δ func exec(value: borrowing Int) { } ͜ͷͰvalue आ༻தʹग़དྷΔൣғͰѻ͑Δ func exec(value: consuming Int) { ˞ ؔϒϩοΫ͚ͩΛߟ͑Εྑ͍ } ˞ ݺग़Ͱݩͷѻ͍ɺݺग़ʹͳ͠ྑ͕ݩͬͯ͘ΕΔ ͜ͷͰvalue ফඅͷରͱͯ͠ѻ͑Δ
·ͱΊ ෳରΛ͢ ˙ value͕ैདྷ௨Γͷѻ͍ͳΒ exec(value) ݺग़ઌͷٻΊʹґΒͣɺ ैདྷ௨ΓʹΛ͢ ⋯ ˞ ैདྷ௨Γͷͷɺैདྷ௨Γʹಈ͘ʢॏཁʣ func exec(_: Int) func exec(_: consuming Int) func exec(_: borrowing Int)
·ͱΊ आ༻͍ͯ͠ΔରΛ͢ ˙ valueΛआ༻͍ͯ͠ΔͳΒ exec(value) func exec(_: Int) func exec(_: borrowing Int) ͨͩ͠ɺফඅ͠Α͏ͱ͢Δ૬खʹ ͞ͳ͍ʢआΓͷΛյ͞ΕͯࠔΔʣ func exec(_: consuming Int) ⋯ आΓͷΛຢିͯ͠͠ ࣗ༝ʹѻͬͯΒ͏ʢӾཡɾෳɾ࠶ି༩ʣ
·ͱΊ ফඅରΛ͢ ˙ ܕͷফඅରͳͳΒ ˙ ࢀরܕͷফඅରͳͳΒ exec(value) exec(object) आ༻͍ͨ͠૬खʹ ି༩͢Δʢফඅ͠ͳ͍ʣ ফඅ͠Α͏ͱ͍ͯ͠Δ૬खʹ ৡͯ͠ɺҎ߱ؔ༩͠ͳ͍ ⋯ ⋯ ैདྷ௨Γʹड͚औΔ૬खʹ ৡͯ͠ɺҎ߱ؔ༩͠ͳ͍ func exec(_: borrowing Int) func exec(_: consuming Int) ैདྷ௨Γʹड͚औΔ૬खͳΒ ফඅ͠ͳ͍ʢࢀর͠ͱಉʁʣ func exec(_: Int)
ॴ༗ͱ·ݖΊ ಛผϧʔϧ
ಛผϧʔϧ ӈลফඅ let other = value WBMVF͕ैདྷ௨ΓͷͳΒ PUIFSʹΛෳͯ͠ೖʢैདྷ௨Γʣ WBMVF͕ফඅͷରͳΒ PUIFSʹݖརΛৡ͠ɺҎ߱WBMVF͑ͳ͘ͳΔ WBMVFΛआ༻͍ͯ͠Δ͚ͩͳΒ PUIFSैདྷ௨Γʹѻ͓͏ͱ͢ΔͷͰɺෳ͠ͳ͍ݶΓͤͳ͍ ˞ ؔͷফඅ͠Α͏ͱ͢ΔҾʹ͢ͱ͖ͱɺ΄΅ಉ͡ڍಈʢͨͩ͠ɺೖʹݩएؔׯ༩ʣ
ಛผϧʔϧ Γʹ͢Δͱফඅ return value WBMVF͕ैདྷ௨ΓͷͳΒ ෳͨ͠Λฦ٫ʢैདྷ௨Γʣ WBMVF͕ফඅͷରͳΒ ݺग़ݖʹݩརΛͦͷ··ৡ WBMVFΛआ༻͍ͯ͠Δ͚ͩͳΒ ͦΕΛख์͢Θ͚ʹ͍͔ͳ͍ͷͰɺෳ͠ͳ͍ݶΓฦͤͳ͍ ˞ ӈลͱಉ͡ϧʔϧ
ॴ༗ͱ·ݖΊ ॴ༗ݖԋࢉࢠ
ॴ༗ݖԋࢉࢠ ෳԋࢉࢠͱফඅԋࢉࢠ ˙ ෳԋࢉࢠ let other = copy value WBMVFΛෳѻ͍ʹ͢Δ ैདྷ௨ΓʹWBMVF͕ෳ͞ΕΔ ˙ ফඅԋࢉࢠ let other = consume value WBMVFΛফඅѻ͍ʹ͢Δ Γʹͨ͠ͷͱಉ༷ʹWBMVF͕ѻΘΕΔʢෳ͞ΕΔՄೳੑʣ
ॴ༗ͱ·ݖΊ Ṗϧʔϧ
Ṗϧʔϧ ଘࡏʹܕফඅͯ͠ೖΔ func calculate(_ value: any BinaryInteger) { ⋯ } calculate(value) ଘࡏܕͷΩϟετ͕ඞཁʹͳΔͱ͖ ͦͷফඅ͞ΕΑ͏ͱ͢Δ आ༻͍ͯ͠ΔফඅͰ͖ͳ͍ͨΊɺෳ͠ͳ͍ͱͤͳ͍ ݺग़ઌ͕ফඅ͠Α͏ͱͯ͠ͳͯ͘ɺଘࡏʹ͖ͱͨͬͳʹܕফඅ͞ΕΔ ˞ ͜Εࠓ͚ͩͷ੍͔ݶ͠Εͳ͍
Ṗϧʔϧ ෆಁ໌ͯ͠ͱܕফඅରΛ͢ͱ͖ func calculate(_ value: some BinaryInteger) { ⋯ } func something(_ value: consuming Int) { calculate(value) } WBMVF͕ফඅରͷͱ͖ɺ ෆಁ໌ܕΛैདྷ௨Γʹड͚औΔ૬खʹͯ͠ɺফඅ͞Εͳ͍ʢṖʣ ˞ ҙਤͨ͠ಈ࡞ͳͷ͔ෆ໌ ˞ ͦͷ΄͔ͷ͠ํɺ௨ৗͷܕͷͱ͖ͱಉ༷
&OKPZ4XJGU 5IBOLZPV ۽୩༑ !FT@LVNBHBJ