概要
Crystalの型を限定した配列と多機能な暗黙のto_procを紹介します
Playground
環境構築せずにPlaygroundでサンプルコードを試せます。
当ページのサンプルコードを実行してみたい方は、以下URLからどうぞ。
型
型付き配列
a = Array(Int32).new
a << 1
a << 2
print a, "\n"
# a << 'a' # Int32以外を指定するとエラーが発生する
- 出力
[1, 2]
※ Rubyと同様に複数の型を扱うことも可能
[1, 'a', 1.1].each{|e|p e.class}
- 出力
Int32
Char
Float64
暗黙のto_procがより高機能
Rubyでは暗黙のto_procを利用して、以下のような簡潔な記載が可能です。
暗黙のto_procについては下記リンクを参照
Ruby | 暗黙の to_proc で遊ぶ - Qiita
Rubyの場合
&:method_name
で暗黙のto_procを呼び出す。
print ('a'..'e').map{|e|e.upcase} #=> ['A', 'B', 'C', 'D', 'E']
print ('a'..'e').map(&:upcase) #=> ['A', 'B', 'C', 'D', 'E']
# メソッドチェーンできない
# print ('a'..'e').map(&:upcase.succ) # => ['B', 'C', 'D', 'E', 'F']
# 引数付メソッドは利用できない
# print ('a'..'e').map(&:to_i(16)) # => [10, 11, 12, 13, 14]
Crystalの場合
&:method_name
の代わりに&.method_name
になっています
print ('a'..'e').map{|e|e.upcase} #=> ['A', 'B', 'C', 'D', 'E']
print ('a'..'e').map(&.upcase) # => ['A', 'B', 'C', 'D', 'E']
# メソッドチェーンできる!
print ('a'..'e').map(&.upcase.succ) # => ['B', 'C', 'D', 'E', 'F']
# 引数付メソッドを利用できる!
print ('a'..'e').map(&.to_i(16)) # => [10, 11, 12, 13, 14]
ちなみにcrystalはreduceがない模様。injectのみ。
メモ
Enumerable#map
と Enumerable#collect
, Enumerable#inject
と Enumerable#reduce
のようなエイリアスによるシンタックスシュガーですが、Crystalでは1つだけを残しているようです。
CrystalはEnumerable#map
, Enumerable#inject
を残し、
Enumerable#collect
, Enumerable#reduce
を削除しています。
以下、Enumerableのドキュメントをみると片方のメソッドしか存在しないことが分かります。
(実際に実行すると、 undefined method 'collect'
のようなエラーが発生します)