SlideShare a Scribd company logo
1 of 36
Download to read offline
Crystal Powered by Rabbit 2.1.6
Crystal
とみたまさひろ
2015-08-23
Crystal Powered by Rabbit 2.1.6
Crystal
http://crystal-lang.org/
Crystal Powered by Rabbit 2.1.6
Ruby風の言語
Crystal Powered by Rabbit 2.1.6
Ruby風?
Crystal Ruby
静的 動的
型あり 型なし
コンパイル言語 スクリプト言語
Crystal Powered by Rabbit 2.1.6
Crystal プログラム
ふつーに Ruby
class Hoge
def foo
p "abc"
end
end
Hoge.new.foo #=> "abc"
Crystal Powered by Rabbit 2.1.6
実行
% ruby hoge.rb
"abc"
% crystal hoge.rb
"abc"
Crystal Powered by Rabbit 2.1.6
ベンチマーク
# フィボナッチ数列のN番目の値
def fib(n)
if n < 2
n
else
fib(n-1) + fib(n-2)
end
end
p fib(35)
Crystal Powered by Rabbit 2.1.6
速い!
% time ruby fib.rb
9227465
real 0m2.275s
user 0m2.268s
sys 0m0.004s
% time crystal fib.rb
9227465
real 0m0.299s
user 0m0.236s
sys 0m0.056s
Crystal Powered by Rabbit 2.1.6
コンパイルして実行ファイルを生成
% crystal build fib.rb --release
% ./fib
9227465
Crystal Powered by Rabbit 2.1.6
さらに速い!
% time crystal fib.rb
9227465
real 0m0.299s
user 0m0.236s
sys 0m0.056s
% time ./fib
9227465
real 0m0.090s
user 0m0.088s
sys 0m0.000s
Crystal Powered by Rabbit 2.1.6
RubyスクリプトをCrystalで実行
するだけで速くなる!?
Crystal Powered by Rabbit 2.1.6
そんなうまい話はない
Crystal Powered by Rabbit 2.1.6
Crystal ≠ Ruby
Crystal Powered by Rabbit 2.1.6
文字と文字列
"A" - 文字列
'A' - 文字
"A"+"B" #=> "AB"
'A'+'B' #=> undefined method '+' for Char
Crystal Powered by Rabbit 2.1.6
多倍長整数がない
整数演算の謎に見える挙動
0x7FFFFFFF.class #=> Int32
0x80000000.class #=> Int64
0x7FFFFFFF+1 #=> -2147483648
0x7FFFFFFFi64+1 #=> 2147483648
256*256*256 #=> 16777216
256**3 #=> 1.67772e+07
256*256*256*256 #=> 0
256**4 #=> 4.29497e+09
Crystal Powered by Rabbit 2.1.6
Crystal は Crystal として使おう
Crystal Powered by Rabbit 2.1.6
拡張子は .rb じゃなくて .cr
Crystal Powered by Rabbit 2.1.6
Crystalの特徴(Rubyと比較して)
Crystal Powered by Rabbit 2.1.6
型
a = [1, 2, 3] #=> Array(Int32)
a.push 4 #=> OK
a.push "a"
#=> no overload matches 'Array(Int32)#push'
# with types String (コンパイル時エラー)
a = [] #=> Syntax error
a = [] of Int32 #=> OK
Crystal Powered by Rabbit 2.1.6
メソッド
def hoge(a, b)
a + b
end
hoge("abc", "xyz") #=> "abcxyz"
hoge(1, 2) #=> 3
hoge("abc", 2) #=> コンパイル時エラー
Crystal Powered by Rabbit 2.1.6
コンパイル時エラー
% crystal build hoge.cr
Error in ./hoge.cr:7: instantiating 'hoge(String, Int32)'
hoge("abc", 2)
^~~~
in ./hoge.cr:2: no overload matches 'String#+' with types Int32
Overloads are:
- String#+(other : self)
- String#+(char : Char)
a + b
^
Crystal Powered by Rabbit 2.1.6
オーバーロード
def hoge(a, b)
a + b
end
def hoge(a : String, b : Int)
a * b
end
hoge("abc", "xyz") #=> "abcxyz"
hoge(1, 2) #=> 3
hoge("abc", 2) #=> "abcabc"
Crystal Powered by Rabbit 2.1.6
変数に型はない
var = 123
var = 'a'
Crystal Powered by Rabbit 2.1.6
複数の型の可能性
var = rand < 0.5 ? 123 : "abc"
var.size # Int にないのでエラー
var + 1 # String にないのでエラー
Crystal Powered by Rabbit 2.1.6
ちゃんと型チェックすればエラーにならない
var = rand < 0.5 ? 123 : "abc"
if var.is_a? Int
var + 1
else
var.size
end
Crystal Powered by Rabbit 2.1.6
静的
Crystal Powered by Rabbit 2.1.6
静的
eval がない
クラス定義/メソッド定義は後勝ち
Crystal Powered by Rabbit 2.1.6
メソッド定義は後勝ち
if rand < 0.5
def hoge # ← rand の値に関係なく無視される
123 #
end #
else
def hoge # ← 常にこっちが有効
"abc" #
end #
end
Crystal Powered by Rabbit 2.1.6
直感に反したり
def hoge
123
end
if false
def hoge
"abc"
end
end
hoge #=> "abc"
Crystal Powered by Rabbit 2.1.6
その他
Crystal Powered by Rabbit 2.1.6
名前付き引数
Rubyより自然かも
def hoge(n=123, s="abc")
p [n, s]
end
hoge #=> [123, "abc"]
hoge(789) #=> [789, "abc"]
hoge(s: "xyz") #=> [123, "xyz"]
Crystal Powered by Rabbit 2.1.6
マクロ
macro define_method(name, content)
def {{name}}
{{content}}
end
end
define_method foo, 123
foo #=> 123
Crystal Powered by Rabbit 2.1.6
プロジェクト雛形作成(Rails風?)
% crystal init app my_project
create my_project/.gitignore
create my_project/LICENSE
create my_project/README.md
create my_project/.travis.yml
create my_project/Projectfile
create my_project/src/my_project.cr
create my_project/src/my_project/version.cr
create my_project/spec/spec_helper.cr
create my_project/spec/my_project_spec.cr
Initialized empty Git repository in /tmp/my_project/.git/
Crystal Powered by Rabbit 2.1.6
ライブラリ依存関係解決(Bundler風)
my_project% cat Projectfile
deps do
github "manastech/crystal-mysql"
end
my_project% crystal deps install
Cloning into '.deps/manastech-crystal-mysql'...
remote: Counting objects: 55, done.
remote: Total 55 (delta 0), reused 0 (delta 0), pack-reused 55
Receiving objects: 100% (55/55), 7.03 KiB | 0 bytes/s, done.
Resolving deltas: 100% (19/19), done.
Checking connectivity... done.
Crystal Powered by Rabbit 2.1.6
ドキュメント作成(YARD風)
my_project% crystal doc
my_project% ls doc
Myproject.html css index.html js list.html main.html
Crystal Powered by Rabbit 2.1.6
テスト(RSpec風)
my_project% crystal spec
.
Finished in 0.38 milliseconds
1 examples, 0 failures, 0 errors, 0 pending

More Related Content

More from Masahiro Tomita

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろMasahiro Tomita
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコルMasahiro Tomita
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわいMasahiro Tomita
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版Masahiro Tomita
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版Masahiro Tomita
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情Masahiro Tomita
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャルMasahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトMasahiro Tomita
 
本当はこわいエンコーディングの話
本当はこわいエンコーディングの話本当はこわいエンコーディングの話
本当はこわいエンコーディングの話Masahiro Tomita
 

More from Masahiro Tomita (20)

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろ
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわい
 
CSV
CSVCSV
CSV
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
Ruby24
Ruby24Ruby24
Ruby24
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
MySQLを拡張する
MySQLを拡張するMySQLを拡張する
MySQLを拡張する
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
 
MyNAができるまで
MyNAができるまでMyNAができるまで
MyNAができるまで
 
文字化け
文字化け文字化け
文字化け
 
メールの暗号化
メールの暗号化メールの暗号化
メールの暗号化
 
文字化け
文字化け文字化け
文字化け
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
 
🍣=🍺
🍣=🍺🍣=🍺
🍣=🍺
 
本当はこわいエンコーディングの話
本当はこわいエンコーディングの話本当はこわいエンコーディングの話
本当はこわいエンコーディングの話
 

Recently uploaded

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 

Recently uploaded (20)

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 

Crystal

  • 1. Crystal Powered by Rabbit 2.1.6 Crystal とみたまさひろ 2015-08-23
  • 2. Crystal Powered by Rabbit 2.1.6 Crystal http://crystal-lang.org/
  • 3. Crystal Powered by Rabbit 2.1.6 Ruby風の言語
  • 4. Crystal Powered by Rabbit 2.1.6 Ruby風? Crystal Ruby 静的 動的 型あり 型なし コンパイル言語 スクリプト言語
  • 5. Crystal Powered by Rabbit 2.1.6 Crystal プログラム ふつーに Ruby class Hoge def foo p "abc" end end Hoge.new.foo #=> "abc"
  • 6. Crystal Powered by Rabbit 2.1.6 実行 % ruby hoge.rb "abc" % crystal hoge.rb "abc"
  • 7. Crystal Powered by Rabbit 2.1.6 ベンチマーク # フィボナッチ数列のN番目の値 def fib(n) if n < 2 n else fib(n-1) + fib(n-2) end end p fib(35)
  • 8. Crystal Powered by Rabbit 2.1.6 速い! % time ruby fib.rb 9227465 real 0m2.275s user 0m2.268s sys 0m0.004s % time crystal fib.rb 9227465 real 0m0.299s user 0m0.236s sys 0m0.056s
  • 9. Crystal Powered by Rabbit 2.1.6 コンパイルして実行ファイルを生成 % crystal build fib.rb --release % ./fib 9227465
  • 10. Crystal Powered by Rabbit 2.1.6 さらに速い! % time crystal fib.rb 9227465 real 0m0.299s user 0m0.236s sys 0m0.056s % time ./fib 9227465 real 0m0.090s user 0m0.088s sys 0m0.000s
  • 11. Crystal Powered by Rabbit 2.1.6 RubyスクリプトをCrystalで実行 するだけで速くなる!?
  • 12. Crystal Powered by Rabbit 2.1.6 そんなうまい話はない
  • 13. Crystal Powered by Rabbit 2.1.6 Crystal ≠ Ruby
  • 14. Crystal Powered by Rabbit 2.1.6 文字と文字列 "A" - 文字列 'A' - 文字 "A"+"B" #=> "AB" 'A'+'B' #=> undefined method '+' for Char
  • 15. Crystal Powered by Rabbit 2.1.6 多倍長整数がない 整数演算の謎に見える挙動 0x7FFFFFFF.class #=> Int32 0x80000000.class #=> Int64 0x7FFFFFFF+1 #=> -2147483648 0x7FFFFFFFi64+1 #=> 2147483648 256*256*256 #=> 16777216 256**3 #=> 1.67772e+07 256*256*256*256 #=> 0 256**4 #=> 4.29497e+09
  • 16. Crystal Powered by Rabbit 2.1.6 Crystal は Crystal として使おう
  • 17. Crystal Powered by Rabbit 2.1.6 拡張子は .rb じゃなくて .cr
  • 18. Crystal Powered by Rabbit 2.1.6 Crystalの特徴(Rubyと比較して)
  • 19. Crystal Powered by Rabbit 2.1.6 型 a = [1, 2, 3] #=> Array(Int32) a.push 4 #=> OK a.push "a" #=> no overload matches 'Array(Int32)#push' # with types String (コンパイル時エラー) a = [] #=> Syntax error a = [] of Int32 #=> OK
  • 20. Crystal Powered by Rabbit 2.1.6 メソッド def hoge(a, b) a + b end hoge("abc", "xyz") #=> "abcxyz" hoge(1, 2) #=> 3 hoge("abc", 2) #=> コンパイル時エラー
  • 21. Crystal Powered by Rabbit 2.1.6 コンパイル時エラー % crystal build hoge.cr Error in ./hoge.cr:7: instantiating 'hoge(String, Int32)' hoge("abc", 2) ^~~~ in ./hoge.cr:2: no overload matches 'String#+' with types Int32 Overloads are: - String#+(other : self) - String#+(char : Char) a + b ^
  • 22. Crystal Powered by Rabbit 2.1.6 オーバーロード def hoge(a, b) a + b end def hoge(a : String, b : Int) a * b end hoge("abc", "xyz") #=> "abcxyz" hoge(1, 2) #=> 3 hoge("abc", 2) #=> "abcabc"
  • 23. Crystal Powered by Rabbit 2.1.6 変数に型はない var = 123 var = 'a'
  • 24. Crystal Powered by Rabbit 2.1.6 複数の型の可能性 var = rand < 0.5 ? 123 : "abc" var.size # Int にないのでエラー var + 1 # String にないのでエラー
  • 25. Crystal Powered by Rabbit 2.1.6 ちゃんと型チェックすればエラーにならない var = rand < 0.5 ? 123 : "abc" if var.is_a? Int var + 1 else var.size end
  • 26. Crystal Powered by Rabbit 2.1.6 静的
  • 27. Crystal Powered by Rabbit 2.1.6 静的 eval がない クラス定義/メソッド定義は後勝ち
  • 28. Crystal Powered by Rabbit 2.1.6 メソッド定義は後勝ち if rand < 0.5 def hoge # ← rand の値に関係なく無視される 123 # end # else def hoge # ← 常にこっちが有効 "abc" # end # end
  • 29. Crystal Powered by Rabbit 2.1.6 直感に反したり def hoge 123 end if false def hoge "abc" end end hoge #=> "abc"
  • 30. Crystal Powered by Rabbit 2.1.6 その他
  • 31. Crystal Powered by Rabbit 2.1.6 名前付き引数 Rubyより自然かも def hoge(n=123, s="abc") p [n, s] end hoge #=> [123, "abc"] hoge(789) #=> [789, "abc"] hoge(s: "xyz") #=> [123, "xyz"]
  • 32. Crystal Powered by Rabbit 2.1.6 マクロ macro define_method(name, content) def {{name}} {{content}} end end define_method foo, 123 foo #=> 123
  • 33. Crystal Powered by Rabbit 2.1.6 プロジェクト雛形作成(Rails風?) % crystal init app my_project create my_project/.gitignore create my_project/LICENSE create my_project/README.md create my_project/.travis.yml create my_project/Projectfile create my_project/src/my_project.cr create my_project/src/my_project/version.cr create my_project/spec/spec_helper.cr create my_project/spec/my_project_spec.cr Initialized empty Git repository in /tmp/my_project/.git/
  • 34. Crystal Powered by Rabbit 2.1.6 ライブラリ依存関係解決(Bundler風) my_project% cat Projectfile deps do github "manastech/crystal-mysql" end my_project% crystal deps install Cloning into '.deps/manastech-crystal-mysql'... remote: Counting objects: 55, done. remote: Total 55 (delta 0), reused 0 (delta 0), pack-reused 55 Receiving objects: 100% (55/55), 7.03 KiB | 0 bytes/s, done. Resolving deltas: 100% (19/19), done. Checking connectivity... done.
  • 35. Crystal Powered by Rabbit 2.1.6 ドキュメント作成(YARD風) my_project% crystal doc my_project% ls doc Myproject.html css index.html js list.html main.html
  • 36. Crystal Powered by Rabbit 2.1.6 テスト(RSpec風) my_project% crystal spec . Finished in 0.38 milliseconds 1 examples, 0 failures, 0 errors, 0 pending