੩తܕ͚ݴޠ$SZTUBM
Crystal The Programming Language with Static Typing
Hirofumi Wakasugi (@5t111111)
Slide 2
Slide 2 text
$SZTUBM੩తܕ͚ͷ
ϓϩάϥϛϯάݴޠͰ͢ɻ
Slide 3
Slide 3 text
੩తܕ͚
w มͳͲͷܕίϯύΠϧ࣌ʹܾఆ͞Ε͍ͯΔ
w ܕνΣοΫʹΑͬͯࣄલʹόάΛัଊ͍͢͠
w มͳͲͷܕ࣮ࡍͷ࣮ߦ࣌ͷʹͳΔ
w ॊೈͰ࠶ར༻ੑͷߴ͍ϓϩάϥϜΛॻ͖͍͢
ಈతܕ͚
Slide 4
Slide 4 text
ಈతܕ͚ͷ3VCZͱ
੩తܕ͚ͷ$SZTUBM
Ͳ͕ͬͪ༏ΕͯΔ͔ͱ͔
ͦ͏͍͏͠·ͤΜʂ
Slide 5
Slide 5 text
$SZTUBM͕
੩తܕ͚ݴޠͱͯ͠
ͲͷΑ͏ʹಇ͔͘
୶ʑͱݟ͍͖ͯ·͢ɻ
Slide 6
Slide 6 text
มͷఆٛ
a = 3
b = "we are like crystal, we break easy"
c = [1, 2, 3]
w มBͷܕ*OU
w มCͷܕ4USJOH
w มDͷܕ"SSBZ *OU
มॳΊ͕ͯೖ͞Εͨͱ͖ʹએݴ͞ΕΔ
Slide 7
Slide 7 text
มͷఆٛ
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
Slide 8
Slide 8 text
มͷ࠶ೖ
͜ΕͲ͏ͳΔʁ
Τϥʔʹͳͬͯ͠·͏ͷʁ
͢Ͱʹએݴ͞Εͯܕ͕ܾ·͍ͬͯΔมʹೖ͢Δ
a = "we are like crystal, it is not easy"
a = 100
Slide 9
Slide 9 text
มͷ࠶ೖ
ผͷܕΛมʹೖͯ͠ΤϥʔʹͳΒͳ͍
มͷܕೖ͞ΕΔࣜ
ʹΑͬͯܕਪ͞ΕΔ
͢Ͱʹએݴ͞Εͯܕ͕ܾ·͍ͬͯΔมʹೖ͢Δ
a = "we are like crystal, it is not easy"
# ここで変数 a は String
a = 100
# ここで変数 a は Int32
Slide 10
Slide 10 text
"SSBZͷܕ
͜ΕͲ͏ͳΔʁ
͍͚ͦ͏͡Όͳ͍ʁ
*OUͷ"SSBZʹ4USJOHܕͷཁૉΛՃ͢Δ
a = [1, 2, 3]
a << "we are like crystal"
Slide 11
Slide 11 text
"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
Slide 12
Slide 12 text
ۭͷ"SSBZ
ܕΛࢦఆͤͣʹۭͷ"SSBZΛએݴ͢Δ͜ͱͰ͖ͳ͍
a = [] # Syntax Error
a = [] of Int32 # OK!
ͱ͍͏͜ͱɺ
ҟͳΔܕͷཁૉΛؚΉ"SSBZ
࡞Εͳ͍ʁ
Slide 13
Slide 13 text
6OJPOܕ
"SSBZ(FOFSJDܕͰ͋Γɺ 6OJPOܕΛؚΉ
ཁૉ
ͷܕΛࢦఆͰ͖Δ
)BTIͳͲɺଞͷίϯςφ ίϨΫγϣϯ
ܕಉ༷
ܕͷΈ߹ΘͤΛදݱ͢Δ6OJPOܕ
a = [1, 2, 3, "we are like crystal"]
#=> Array(String | Int32)
a = [] of String | Int32
#=> Array(String | Int32)
Slide 14
Slide 14 text
(FOFSJDܕ
ޙͰઆ໌͠·͢͠·ͤΜ
Slide 15
Slide 15 text
ϝιουݺͼग़͠
͜ΕͲ͏ͳΔʁ
Τϥʔʹͳͬͯ͠·͏ͷʁ
͋Δܕ Ϋϥε
ʹଘࡏ͠ͳ͍ϝιουΛݺͼग़ͨ͠߹
a = 3
a.size
Slide 16
Slide 16 text
ϝιουݺͼग़͠
͋Δܕ Ϋϥε
ʹଘࡏ͠ͳ͍ϝιουΛݺͼग़ͨ͠߹
a = 3
a.size
undefined method 'size' for Int32
a.size
^~~~
͜Ε
ίϯύΠϧΤϥʔ
&SSPS
Slide 17
Slide 17 text
ϝιουҾ
def put_size(x)
puts x.size
end
put_size("crystal")
put_size(5)
undefined method 'size' for Int32
puts x.size
^~~~
&SSPS
ҾͰ͞ΕͨΦϒδΣΫτʹϝιου͕ͳ͍
Slide 18
Slide 18 text
ܕ੍
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
ҾʹܕΞϊςʔγϣϯΛࢦఆ͠ܕΛ੍͢Δ
3F3FϝιουҾ
def put_size(x)
puts x.size
end
put_size("crystal")
put_size(5)
undefined method 'size' for Int32
puts x.size
^~~~
&SSPS
ܕ੍Λ͠ͳͯ͘ίϯύΠϧ࣌ʹΤϥʔ͕ัଊ͞ΕΔ
ෆඞཁͳܕ੍
ॊೈੑΛܽ͘
Slide 25
Slide 25 text
Πϯελϯεม
Πϯελϯεมೖ͞ΕΔ͔Βܕਪ͞ΕΔ
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Πϯελϯεม
ΠϯελϯεมʹҟͳΔܕΛ༩͑ͯॳظԽ
undefined method 'size' for Int32 (compile-time type is
(String | Int32))
barney.name.size #=> 4
^~~~
͜Ε
ίϯύΠϧΤϥʔ
&SSPS
Slide 28
Slide 28 text
JGWBSJT@B ʜ
JT@B ͰܕΛνΣοΫ੍͠ݶ͢Δ
if a.is_a?(String)
# ここでは a が
# String で「ある」ことが保証される
else
# ここでは a が
# String では「ない」ことが保証される
end
ίϯύΠϧ࣌ϦϑϨΫγϣϯʹΑΔܕͷอূ
Slide 29
Slide 29 text
JGWBSSFTQPOET@UP ʜ
SFTQPOET@UP ͰԠΛνΣοΫ੍͠ݶ͢Δ
if a.responds_to?(:size)
# ここでは a が
# size に応答「する」ことが保証される
else
# ここでは a が
# size に応答「しない」ことが保証される
end
ίϯύΠϧ࣌ϦϑϨΫγϣϯʹΑΔϝιουԠͷอূ
Slide 30
Slide 30 text
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
Πϯελϯεมͷ߹ɺ্هͷΑ͏ʹҰมʹೖ͢Δඞཁ͕͋Δ
Slide 31
Slide 31 text
BT
BTͰܕΛ੍ݶ͢Δ͜ͱͰ͖Δ
name = barney.name as String
name.size #=> 4
w BT࣮ߦ࣌ʹνΣοΫΛߦ͏
w ର͕4USJOHͰͳ͔ͬͨ߹ʹྫ֎͕ൃੜ
w BTΩϟετͰͳ͍ ผͷܕͷม͠ͳ͍
Slide 32
Slide 32 text
OJMBCMF
͋Δܕ͕/JMܕΛ࣋ͭՄೳੑ
a = [] of String?
a.class #=> Array(String?)
a << "crystal" #=> ["crystal"]
a << nil #=> ["crystal", nil]
w 4USJOH ܕ͕/JMܕΛ࣋ͭ͜ͱΛҙຯ͢Δ
w 4USJOHc/JM
ͱ͍͏6OJPOܕͱಉ༷
Slide 33
Slide 33 text
OJMBCMFΠϯελϯεม
JOJUJBMJ[FͰॳظԽ͞Εͳ͍Πϯελϯεม
class Person
getter name
property address
def initialize(@name)
end
end
barney = Person.new "Barney"
barney.address = "Manchester"
barney.address.size
Slide 34
Slide 34 text
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ܕΛ࣋ͭ
Slide 35
Slide 35 text
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
Slide 36
Slide 36 text
Πϯελϯεมͷܕࢦఆ
ΠϯελϯεมΛܕΞϊςʔγϣϯͰࢦఆ͢Δ
class Person
…
@address :: String
…
end
w !BEESFTTʹ4USJOHҎ֎ͷܕΛೖ͢ΔͱΤϥʔ
w ܕͷσϑΥϧτଘࡏ͠ͳ͍ͷͰॳظԽඞཁ
Slide 37
Slide 37 text
·ͱΊ
w $SZTUBM㱠3VCZ
w தͰ੩తܕ͚ʹΑΔҧ͍ඇৗʹେ͖͍
ͦΕͰɺ
We love Ruby's efficiency for writing code.
ͱ͍͏ͷ͕$SZTUBMͷग़ൃͷͭͰ͋ΔΑ͏ʹɺ
3VCZͷॊೈੑੜ࢈ੑɺؾ͍͍࣋ͪॻ͖ຯΛҡ࣋ͯ͠
੩తܕ͚ʹ͠Α͏ͱ͢Δ͕ਵॴʹݟΒΕΔɻ
Slide 38
Slide 38 text
ͤͳ͔ͬͨͨͪ
w (FOFSJDܕ (FOFSJDT
w ྫ֎ॲཧͰͷܕਪͷಇ͖
w ΫϩʔδϟͰͷมͷܕ
w ϚΫϩʹ͓͚ΔܕใͷΞΫηε
w UZQFPGɺ0CKFDUUSZͳͲͷϝιου
w FUDFUD