Crystalの型を限定した配列と多機能な暗黙のto_proc #crystal #ruby


概要

Crystalの型を限定した配列と多機能な暗黙のto_procを紹介します

Playground

環境構築せずにPlaygroundでサンプルコードを試せます。
当ページのサンプルコードを実行してみたい方は、以下URLからどうぞ。

playground- crystal

型付き配列

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#mapEnumerable#collect, Enumerable#injectEnumerable#reduce
のようなエイリアスによるシンタックスシュガーですが、Crystalでは1つだけを残しているようです。
CrystalはEnumerable#map , Enumerable#injectを残し、
Enumerable#collect, Enumerable#reduceを削除しています。

以下、Enumerableのドキュメントをみると片方のメソッドしか存在しないことが分かります。
(実際に実行すると、undefined method 'collect'のようなエラーが発生します)