Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
静的型付け言語 Crystal
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hirofumi Wakasugi
October 23, 2015
Programming
150
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
静的型付け言語 Crystal
Tokyo Crystal Meetup #2 (2015-10-23)
Hirofumi Wakasugi
October 23, 2015
More Decks by Hirofumi Wakasugi
See All by Hirofumi Wakasugi
Racc Introduction
5t111111
1
500
Keep Calm and Enjoy Gachima
5t111111
3
400
Swift Functional Programming
5t111111
0
330
Middleman on Production
5t111111
0
220
名古屋Ruby会議03 高速一言感想
5t111111
3
1.1k
ドキュメント翻訳懺悔のLT ~進捗ダメです~
5t111111
1
730
UFO演算子について
5t111111
0
450
Rubyと戯れるOSS DTM
5t111111
4
840
Rubyの拡張をCrystalで書いてみる
5t111111
0
180
Other Decks in Programming
See All in Programming
技術記事、 専門家としてのプログラマ、 言語化
mizchi
4
2.9k
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
260
OSもどきOS
arkw
0
530
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2k
Inside Stream API
skrb
1
690
スマートグラスで並列バイブコーディング
hyshu
0
120
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
210
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
120
3Dシーンの圧縮
fadis
1
740
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
190
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
Are puppies a ranking factor?
jonoalderson
1
3.5k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Code Review Best Practice
trishagee
74
20k
Embracing the Ebb and Flow
colly
88
5.1k
The Cult of Friendly URLs
andyhume
79
6.9k
Transcript
੩తܕ͚ݴޠ$SZTUBM Crystal The Programming Language with Static Typing Hirofumi Wakasugi
(@5t111111)
$SZTUBM੩తܕ͚ͷ ϓϩάϥϛϯάݴޠͰ͢ɻ
੩తܕ͚ w มͳͲͷܕίϯύΠϧ࣌ʹܾఆ͞Ε͍ͯΔ w ܕνΣοΫʹΑͬͯࣄલʹόάΛัଊ͍͢͠ w มͳͲͷܕ࣮ࡍͷ࣮ߦ࣌ͷʹͳΔ w ॊೈͰ࠶ར༻ੑͷߴ͍ϓϩάϥϜΛॻ͖͍͢ ಈతܕ͚
ಈతܕ͚ͷ3VCZͱ ੩తܕ͚ͷ$SZTUBM Ͳ͕ͬͪ༏ΕͯΔ͔ͱ͔ ͦ͏͍͏͠·ͤΜʂ
$SZTUBM͕ ੩తܕ͚ݴޠͱͯ͠ ͲͷΑ͏ʹಇ͔͘ ୶ʑͱݟ͍͖ͯ·͢ɻ
มͷఆٛ a = 3 b = "we are like crystal,
we break easy" c = [1, 2, 3] w มBͷܕ*OU w มCͷܕ4USJOH w มDͷܕ"SSBZ *OU มॳΊ͕ͯೖ͞Εͨͱ͖ʹએݴ͞ΕΔ
มͷఆٛ w มBͷܕ*OU w มCͷܕ4USJOH w มDͷܕ"SSBZ *OU มॳΊ͕ͯೖ͞Εͨͱ͖ʹએݴ͞ΕΔ a
= 3 b = "we are like crystal, we break easy" c = [1, 2, 3] ܕਪ 5ZQF*OGFSFODF
มͷ࠶ೖ ͜ΕͲ͏ͳΔʁ Τϥʔʹͳͬͯ͠·͏ͷʁ ͢Ͱʹએݴ͞Εͯܕ͕ܾ·͍ͬͯΔมʹೖ͢Δ a = "we are like crystal,
it is not easy" a = 100
มͷ࠶ೖ ผͷܕΛมʹೖͯ͠ΤϥʔʹͳΒͳ͍ มͷܕೖ͞ΕΔࣜ ʹΑͬͯܕਪ͞ΕΔ ͢Ͱʹએݴ͞Εͯܕ͕ܾ·͍ͬͯΔมʹೖ͢Δ a = "we are
like crystal, it is not easy" # ここで変数 a は String a = 100 # ここで変数 a は Int32
"SSBZͷܕ ͜ΕͲ͏ͳΔʁ ͍͚ͦ͏͡Όͳ͍ʁ *OUͷ"SSBZʹ4USJOHܕͷཁૉΛՃ͢Δ a = [1, 2, 3] a
<< "we are like crystal"
"SSBZͷܕ *OUͷ"SSBZʹ4USJOHܕͷཁૉΛՃ͢Δ a = [1, 2, 3] a << "we
are like crystal" no overload matches 'Array(Int32)#<<' with types String Overloads are: - Array(Int32)#<<(value : Int32) a << "we are like crystal" ^~ ͜Ε ίϯύΠϧΤϥʔ &SSPS
ۭͷ"SSBZ ܕΛࢦఆͤͣʹۭͷ"SSBZΛએݴ͢Δ͜ͱͰ͖ͳ͍ a = [] # Syntax Error a =
[] of Int32 # OK! ͱ͍͏͜ͱɺ ҟͳΔܕͷཁૉΛؚΉ"SSBZ ࡞Εͳ͍ʁ
6OJPOܕ "SSBZ(FOFSJDܕͰ͋Γɺ 6OJPOܕΛؚΉ ཁૉ ͷܕΛࢦఆͰ͖Δ )BTIͳͲɺଞͷίϯςφ ίϨΫγϣϯ ܕಉ༷ ܕͷΈ߹ΘͤΛදݱ͢Δ6OJPOܕ a
= [1, 2, 3, "we are like crystal"] #=> Array(String | Int32) a = [] of String | Int32 #=> Array(String | Int32)
(FOFSJDܕ ޙͰઆ໌͠·͢͠·ͤΜ
ϝιουݺͼग़͠ ͜ΕͲ͏ͳΔʁ Τϥʔʹͳͬͯ͠·͏ͷʁ ͋Δܕ Ϋϥε ʹଘࡏ͠ͳ͍ϝιουΛݺͼग़ͨ͠߹ a = 3 a.size
ϝιουݺͼग़͠ ͋Δܕ Ϋϥε ʹଘࡏ͠ͳ͍ϝιουΛݺͼग़ͨ͠߹ a = 3 a.size undefined method
'size' for Int32 a.size ^~~~ ͜Ε ίϯύΠϧΤϥʔ &SSPS
ϝιουҾ def put_size(x) puts x.size end put_size("crystal") put_size(5) undefined method
'size' for Int32 puts x.size ^~~~ &SSPS ҾͰ͞ΕͨΦϒδΣΫτʹϝιου͕ͳ͍
ܕ੍ def put_size(x : String) puts x.size end put_size(5) no
overload matches 'put_size' with types Int32 Overloads are: - put_size(x : String) put_size(5) ^~~~~~~~ &SSPS ҾʹܕΞϊςʔγϣϯΛࢦఆ͠ܕΛ੍͢Δ
ܕ੍͕͋Δͱ҆৺ͩͶʂ ҾͲΜͲΜܕ੍͠Α͏ʂ
3FϝιουҾ def put_size(x) puts x.size end put_size("crystal") put_size([1, 2, 3])
ҾͰ͞ΕͨΦϒδΣΫτʹϝιου͕͋Δ ͑ͬʁ
3FϝιουҾ def put_size(x) puts x.size end put_size("crystal") put_size([1, 2, 3])
ҾͰ͞ΕͨΦϒδΣΫτʹϝιου͕͋Δ 7 3 3FTVMU Τϥʔͳ͘ਖ਼ৗऴྃ͢Δ
3FϝιουҾ def put_size(x) puts x.size end put_size("crystal") put_size([1, 2, 3])
ҾͰ͞ΕͨΦϒδΣΫτʹϝιου͕͋Δ 7 3 3FTVMU Τϥʔͳ͘ਖ਼ৗऴྃ͢Δ ໌֬ʹܕ੍͕͞Ε͍ͯ ͳ͚Εɺ͋Δܕ͕ݺͼ ग़͞ΕΔϝιουʹԠ ͢Δͱ͖ɺίϯύΠϥͷ ܕνΣοΫ௨Δɻ
μοΫλΠϐϯάతͳܕγεςϜ ܕͦͷͷͦͷܧঝؔʹґଘ͠ͳ͍ɺ ॊೈੑΛ࣋ͬͨ੩తܕ͚ʹͳ͍ͬͯΔ γάωΠνϟ͕ಛʹॏཁͰ͋Δͱ͍͏Ͱɺ 4USVDUVSBM4VCUZQJOH ߏత෦ܕ͚ ͱݴͬͯΑ͍͔
3F3FϝιουҾ def put_size(x) puts x.size end put_size("crystal") put_size(5) undefined method
'size' for Int32 puts x.size ^~~~ &SSPS ܕ੍Λ͠ͳͯ͘ίϯύΠϧ࣌ʹΤϥʔ͕ัଊ͞ΕΔ ෆඞཁͳܕ੍ ॊೈੑΛܽ͘
Πϯελϯεม Πϯελϯεมೖ͞ΕΔ͔Βܕਪ͞ΕΔ class Person getter name def initialize(@name) end end
barney = Person.new "Barney" barney.name #=> "Barney" barney.name.size #=> 6
barney = Person.new "Barney" barney.name.size one = Person.new 1 3FΠϯελϯεม
ΠϯελϯεมʹҟͳΔܕΛ༩͑ͯॳظԽ ͳΜ͔͓͔͍͠ͱ͋͜Δʁ
barney = Person.new "Barney" barney.name.size one = Person.new 1 3FΠϯελϯεม
ΠϯελϯεมʹҟͳΔܕΛ༩͑ͯॳظԽ undefined method 'size' for Int32 (compile-time type is (String | Int32)) barney.name.size #=> 4 ^~~~ ͜Ε ίϯύΠϧΤϥʔ &SSPS
JGWBSJT@B ʜ JT@B ͰܕΛνΣοΫ੍͠ݶ͢Δ if a.is_a?(String) # ここでは a が
# String で「ある」ことが保証される else # ここでは a が # String では「ない」ことが保証される end ίϯύΠϧ࣌ϦϑϨΫγϣϯʹΑΔܕͷอূ
JGWBSSFTQPOET@UP ʜ SFTQPOET@UP ͰԠΛνΣοΫ੍͠ݶ͢Δ if a.responds_to?(:size) # ここでは a が
# size に応答「する」ことが保証される else # ここでは a が # size に応答「しない」ことが保証される end ίϯύΠϧ࣌ϦϑϨΫγϣϯʹΑΔϝιουԠͷอূ
3F3FΠϯελϯεม JT@B SFTQPOET@UP Ͱ੍ݶ͢Δ if (name = barney.name).is_a?(String) name.size #=>
4 end if (name = barney.name).responds_to?(:size) name.size #=> 4 end Πϯελϯεมͷ߹ɺ্هͷΑ͏ʹҰมʹೖ͢Δඞཁ͕͋Δ
BT BTͰܕΛ੍ݶ͢Δ͜ͱͰ͖Δ name = barney.name as String name.size #=> 4
w BT࣮ߦ࣌ʹνΣοΫΛߦ͏ w ର͕4USJOHͰͳ͔ͬͨ߹ʹྫ֎͕ൃੜ w BTΩϟετͰͳ͍ ผͷܕͷม͠ͳ͍
OJMBCMF ͋Δܕ͕/JMܕΛ࣋ͭՄೳੑ a = [] of String? a.class #=> Array(String?)
a << "crystal" #=> ["crystal"] a << nil #=> ["crystal", nil] w 4USJOH ܕ͕/JMܕΛ࣋ͭ͜ͱΛҙຯ͢Δ w 4USJOHc/JM ͱ͍͏6OJPOܕͱಉ༷
OJMBCMFΠϯελϯεม JOJUJBMJ[FͰॳظԽ͞Εͳ͍Πϯελϯεม class Person getter name property address def initialize(@name)
end end barney = Person.new "Barney" barney.address = "Manchester" barney.address.size
OJMBCMFΠϯελϯεม JOJUJBMJ[FͰॳظԽ͞Εͳ͍Πϯελϯεม barney = Person.new "Barney" barney.address = "Manchester" barney.address.size
undefined method 'size' for Nil (compile-time type is String?) barney.address.size ^~~~ &SSPS ͜Ε ίϯύΠϧΤϥʔ JOJUJBMJ[FͰॳظԽ͞Εͳ͍Πϯελϯεม/JMܕΛ࣋ͭ
3FOJMBCMFΠϯελϯεม ΠϯελϯεมΛJOJUJBMJ[Fͷ֎ଆͰॳظԽ͢Δ class Person getter name property address @address =
"nowhere" def initialize(@name) end end barney = Person.new "Barney" barney.address = "Manchester" barney.address.size #=> 10
Πϯελϯεมͷܕࢦఆ ΠϯελϯεมΛܕΞϊςʔγϣϯͰࢦఆ͢Δ class Person … @address :: String … end
w !BEESFTTʹ4USJOHҎ֎ͷܕΛೖ͢ΔͱΤϥʔ w ܕͷσϑΥϧτଘࡏ͠ͳ͍ͷͰॳظԽඞཁ
·ͱΊ w $SZTUBM㱠3VCZ w தͰ੩తܕ͚ʹΑΔҧ͍ඇৗʹେ͖͍ ͦΕͰɺ We love Ruby's efficiency
for writing code. ͱ͍͏ͷ͕$SZTUBMͷग़ൃͷͭͰ͋ΔΑ͏ʹɺ 3VCZͷॊೈੑੜ࢈ੑɺؾ͍͍࣋ͪॻ͖ຯΛҡ࣋ͯ͠ ੩తܕ͚ʹ͠Α͏ͱ͢Δ͕ਵॴʹݟΒΕΔɻ
ͤͳ͔ͬͨͨͪ w (FOFSJDܕ (FOFSJDT w ྫ֎ॲཧͰͷܕਪͷಇ͖ w ΫϩʔδϟͰͷมͷܕ w
ϚΫϩʹ͓͚ΔܕใͷΞΫηε w UZQFPGɺ0CKFDUUSZͳͲͷϝιου w FUDFUD
IUUQKBDSZTUBMMBOHPSHEPDT ࠓͤͳ͔ͬͨ༰υΩϡϝϯτʹهࡌ͕͋Γ·͢
υΩϡϝϯτΛ͍ͭVQUPEBUFʹ͢ΔͨΊʹ ༁Λखͬͯ͘ΕΔํΛืू͍ͯ͠·͢ (JU)VC IUUQTHJUIVCDPNDSZTUBMKQKBDSZTUBMMBOHPSH (JUUFS IUUQTHJUUFSJNDSZTUBMKQKBDSZTUBMMBOHPSH ͘͠@5t111111·Ͱ͓Β͍ͤͩ͘͞ʂ 4MBDL IUUQDSZTUBMQJOFNPF
ຊεϥΠυதͷαϯϓϧίʔυ ͓Αͼͦͷग़ྗ༰ ͯ͢$SZTUBMͰ֬ೝ͍ͯ͠·͢ ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ