Crystalドキュメントの Literals を読んだのでメモ。
コメント
#
による一行コメントのみ
Nil
nil
。普通
Bool
true
とfalse
の二つの値を持つ- RubyではBool型は存在しなくて、それぞれ
TrueClass
とFalseClass
の唯一の値という形なので、そこがちょっと違う
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(...)
で囲う
- string interpolationを無効にするには
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...y
。Rubyと同じ
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
->
で作る。lambda
やproc
キーワードはない->(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')