大括号构造函数?
Curly bracket constructors?
在阅读 Crystal 文档时,我遇到了这一行:
deq = Deque{2, 3}
所以我认为这会调用 Deque.new(array : Array(T))
构造函数。但是,我没有找到任何关于此语法的文档。
(编辑: The documentation can be found here)
为了测试这种调用构造函数的方式,我写了下面的测试
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
但是,编译它会打印出这个错误:
Error in line 10: wrong number of arguments for 'Foo(Int32).new' (given 0, expected 1)
Overloads are:
- Foo(T).new(bar : Array(T))
我真的一点都不懂。
Foo(Int32){1}
引发相同的错误。
问题是,Klass{1, 2, 3}
语法是什么?以及如何使用它?
它们记录在这里:https://crystal-lang.org/docs/syntax_and_semantics/literals/array.html
Array-like 键入文字
Crystal 支持数组和 array-like 类型的附加文字。它包含类型的名称,后面是用花括号括起来的元素列表 ({}
) 和用逗号分隔的各个元素 (,
).
Array{1, 2, 3}
这个文字可以用于任何类型,只要它有一个无参数的构造函数并且响应 <<
。
IO::Memory{1, 2, 3}
Set{1, 2, 3}
对于像 IO::Memory
这样的 non-generic 类型,这等同于:
array_like = IO::Memory.new
array_like << 1
array_like << 2
array_like << 3
对于像 Set
这样的泛型类型,泛型类型 T
是从元素的类型推断出来的,其方式与数组文字相同。以上相当于:
array_like = Set(typeof(1, 2, 3)).new
array_like << 1
array_like << 2
array_like << 3
类型参数可以明确指定为类型名称的一部分:
Set(Number) {1, 2, 3}
要创建这样的类型,您需要定义无臂构造函数和 #<<
方法:
class Foo(T)
def initialize
@store = Array(T).new
end
def <<(elem : T)
@store << elem
end
end
foo = Foo(Int32){1, 2, 3}
p foo #=> #<Foo(Int32):0x103440b20 @store=[1, 2, 3]>
在阅读 Crystal 文档时,我遇到了这一行:
deq = Deque{2, 3}
所以我认为这会调用 Deque.new(array : Array(T))
构造函数。但是,我没有找到任何关于此语法的文档。
(编辑: The documentation can be found here)
为了测试这种调用构造函数的方式,我写了下面的测试
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
但是,编译它会打印出这个错误:
Error in line 10: wrong number of arguments for 'Foo(Int32).new' (given 0, expected 1)
Overloads are:
- Foo(T).new(bar : Array(T))
我真的一点都不懂。
Foo(Int32){1}
引发相同的错误。
问题是,Klass{1, 2, 3}
语法是什么?以及如何使用它?
它们记录在这里:https://crystal-lang.org/docs/syntax_and_semantics/literals/array.html
Array-like 键入文字
Crystal 支持数组和 array-like 类型的附加文字。它包含类型的名称,后面是用花括号括起来的元素列表 ({}
) 和用逗号分隔的各个元素 (,
).
Array{1, 2, 3}
这个文字可以用于任何类型,只要它有一个无参数的构造函数并且响应 <<
。
IO::Memory{1, 2, 3}
Set{1, 2, 3}
对于像 IO::Memory
这样的 non-generic 类型,这等同于:
array_like = IO::Memory.new
array_like << 1
array_like << 2
array_like << 3
对于像 Set
这样的泛型类型,泛型类型 T
是从元素的类型推断出来的,其方式与数组文字相同。以上相当于:
array_like = Set(typeof(1, 2, 3)).new
array_like << 1
array_like << 2
array_like << 3
类型参数可以明确指定为类型名称的一部分:
Set(Number) {1, 2, 3}
要创建这样的类型,您需要定义无臂构造函数和 #<<
方法:
class Foo(T)
def initialize
@store = Array(T).new
end
def <<(elem : T)
@store << elem
end
end
foo = Foo(Int32){1, 2, 3}
p foo #=> #<Foo(Int32):0x103440b20 @store=[1, 2, 3]>