LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-18

:sparkles::gem::sparkles: 概要

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

:gem: 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]

:sparkles::gem::sparkles: 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'のようなエラーが発生します)

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3