Crystal言語のドキュメントを読む(Literals)

Crystalドキュメントの Literals を読んだのでメモ。

コメント

  • # による一行コメントのみ

Nil

  • nil 。普通

Bool

  • truefalse の二つの値を持つ
  • RubyではBool型は存在しなくて、それぞれ TrueClassFalseClass の唯一の値という形なので、そこがちょっと違う

Integers

  • 8bit, 16bit, 32bit, 64bit。unsignedあり。
    • リテラルの接尾辞で型を明示できる。 _i16, _u32 など。
  • 整数リテラルの型は、サイズによって signed 32bit, signed 64bit, unsigned 64bit のどれかに決まる。
  • アンダースコア区切りOK
  • 0b でbinary、 0o でoctal、 0x でhexadecimal

Floats

  • デフォルト64bit。32bitを使いたいときは接尾辞に _f32 を付ける。
  • アンダースコア区切りOK

Char

  • Unicodeコードポイントを表す32bit値
  • \uxxxx で16進数4桁、 \u{xxxxxx} で16進数6桁までのコードポイント指定

String

  • immutable
  • 引用符は " のみ
  • %(...) のようなクォートもできる。括弧は他の種類もOK
  • \u に続けて16進数でコードポイント指定(Charと同じ)
  • リテラル内で改行できる
  • ヒアドキュメントは <<-IDENT から IDENT まで
  • #{} でstring interpolation
    • string interpolationを無効にするには %q(...) で囲う

Symbol

  • :hello など。普通

Array

  • genericな型を持つ。型は構築時に決まる。
    • たとえば [1,2,3]Array(Int32)[1,"Hello",'x']Array(Int32|String|Char)
    • 空配列を作るときは型を明示する必要がある。 [] of Int32
  • Rubyと同じように、 %w(one two three) で Array(String) が作れる
  • %i(one two three) で Array(Symbol) が作れる

Hash

  • genericな型を持つ。型は構築時に決まる。
    • たとえば {1=>2, 3=>4}Hash(Int32, Int32){1=>2, 'a'=>3}Hash(Int32|Char, Int32)
    • 空ハッシュを作るときは型を明示する必要がある。 {} of Int32 => Int32

Range

  • x..y とか x...yRubyと同じ

Regex

  • スラッシュ区切りで /foo|bar/ とするか、 %rと括弧で %r(foo|bar) とするか
  • PCRE というのが文法らしい

Tuple

  • タプルがある!
  • {1, "Hello", 'x'}Tuple(Int32, String, Char) 型になる
  • 空のタプルを作るときは Tuple.new を使う
  • メモリが静的にスタックに割り付けられる。関数から複数の戻り値を返すようなときに使うと良い

NamedTuple

  • NamedTupleがある!
  • {name: "Crystal", year: 2011}NamedTuple(name: String, year: Int32) 型になる(キーの値も型に含まれるということ?)
  • tuple[:name] のようにアクセスする
  • キーはStringでもOK

Proc

  • -> で作る。 lambdaproc キーワードはない
  • ->(x : Int32, y : Int32) { (x + y).to_s }Proc(Int32, Int32, String) 型になる
  • 引数の型は基本的に指定が必須
  • メソッドをProc化できる
def increment(x)
    x + 1
end
proc = ->increment(Int32) # 引数の型を限定している
  • レシーバを指定してProc化もできる
str = "abc"
proc = ->str.count(Char)
puts proc.call('x')