在阅读Crystal文档时,我遇到了这一行:
deq = Deque{2, 3}
Run Code Online (Sandbox Code Playgroud)
所以我认为这会调用Deque.new(array : Array(T))构造函数.但是,我没有找到任何关于此语法的文档.(编辑:文档可以在这里找到)
为了测试这种调用构造函数的方式,我编写了以下测试
class Foo(T)
def initialize(@bar : Array(T)); end
def to_s(io : IO)
io << "Foo: "
io << @bar
end
end
puts Foo{1} # Line 10
Run Code Online (Sandbox Code Playgroud)
但是,编译它会打印出这个错误:
Error in line 10: wrong number of arguments for 'Foo(Int32).new' (given 0, expected 1)
Overloads are:
- Foo(T).new(bar : Array(T))
Run Code Online (Sandbox Code Playgroud)
我真的根本不懂.
Foo(Int32){1}引发同样的错误.
问题是,这个Klass{1, 2, 3}语法是什么?你怎么用它?
它们记录在这里:https://crystal-lang.org/docs/syntax_and_semantics/literals/array.html
Crystal支持数组和类数组类型的附加文字.它由类型的名称后跟一个用花括号({})括起来的元素列表和用逗号(,)分隔的单个元素组成.
Array{1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
这个文字可以用于任何类型,只要它有一个argless构造函数并响应<<.
IO::Memory{1, 2, 3}
Set{1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
对于非泛型类型IO::Memory,这相当于:
array_like = IO::Memory.new
array_like << 1
array_like << 2
array_like << 3
Run Code Online (Sandbox Code Playgroud)
对于泛型类型Set,泛型类型T是以与数组文字相同的方式从元素的类型推断出来的.以上相当于:
array_like = Set(typeof(1, 2, 3)).new
array_like << 1
array_like << 2
array_like << 3
Run Code Online (Sandbox Code Playgroud)
类型参数可以显式指定为类型名称的一部分:
Set(Number) {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)