类型语法¶
什么时候
- 指定 类型限制
- 指定 类型参数
- 声明变量
- 声明 别名
- 声明 typedefs
- 一个 is_a? 伪调用的参数
- 一个 as 表达式的参数
- 一个 sizeof 或 instance_sizeof 表达式的参数
- 一个 alignof 或 instance_alignof 表达式的参数
- 一个方法的 返回值类型
对于一些常用类型,提供了一种方便的语法。这些在编写 C 绑定 时特别有用,但可以在上述任何位置使用。
路径和泛型¶
可以使用常规类型和泛型
Int32
My::Nested::Type
Array(String)
联合¶
alias Int32OrString = Int32 | String
类型中的管道 (|
) 创建一个联合类型。Int32 | String
读取为“Int32 或 String”。在常规代码中,Int32 | String
表示在 Int32
上调用 |
方法,并将 String
作为参数。
可空¶
alias Int32OrNil = Int32?
与以下相同
alias Int32OrNil = Int32 | ::Nil
在常规代码中,Int32?
本身就是一个 Int32 | ::Nil
联合类型。
指针¶
alias Int32Ptr = Int32*
与以下相同
alias Int32Ptr = Pointer(Int32)
在常规代码中,Int32*
表示在 Int32
上调用 *
方法。
静态数组¶
alias Int32_8 = Int32[8]
与以下相同
alias Int32_8 = StaticArray(Int32, 8)
在常规代码中,Int32[8]
表示在 Int32
上调用 []
方法,并将 8
作为参数。
元组¶
alias Int32StringTuple = {Int32, String}
与以下相同
alias Int32StringTuple = Tuple(Int32, String)
在常规代码中,{Int32, String}
是一个元组实例,包含 Int32
和 String
作为其元素。这不同于上面的元组 **类型**。
命名元组¶
alias Int32StringNamedTuple = {x: Int32, y: String}
与以下相同
alias Int32StringNamedTuple = NamedTuple(x: Int32, y: String)
在常规代码中,{x: Int32, y: String}
是一个命名元组实例,包含 Int32
和 String
分别用于 x
和 y
。这不同于上面的命名元组 **类型**。
Proc¶
alias Int32ToString = Int32 -> String
与以下相同
alias Int32ToString = Proc(Int32, String)
要指定一个没有参数的 Proc
alias ProcThatReturnsInt32 = -> Int32
要指定多个参数
alias Int32AndCharToString = Int32, Char -> String
对于嵌套的 procs(以及一般情况下的任何类型),可以使用括号
alias ComplexProc = (Int32 -> Int32) -> String
在常规代码中,Int32 -> String
是一个语法错误。
self¶
self
可以用在类型语法中来表示 self
类型。请参阅 类型限制 部分。
类¶
class
用于引用类类型,而不是实例类型。
例如
def foo(x : Int32)
"instance"
end
def foo(x : Int32.class)
"class"
end
foo 1 # "instance"
foo Int32 # "class"
class
也用于创建类类型的数组和集合
class Parent
end
class Child1 < Parent
end
class Child2 < Parent
end
ary = [] of Parent.class
ary << Child1
ary << Child2
下划线¶
类型限制中允许使用下划线。它匹配任何内容
# Same as not specifying a restriction, not very useful
def foo(x : _)
end
# A bit more useful: any two-parameter Proc that returns an Int32:
def foo(x : _, _ -> Int32)
end
在常规代码中,_
表示 下划线 变量。
typeof¶
typeof
在类型语法中是允许的。它返回传递表达式的类型的联合类型
typeof(1 + 2) # => Int32
typeof(1, "a") # => (Int32 | String)