跳至内容

类型语法

什么时候

对于一些常用类型,提供了一种方便的语法。这些在编写 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} 是一个元组实例,包含 Int32String 作为其元素。这不同于上面的元组 **类型**。

命名元组

alias Int32StringNamedTuple = {x: Int32, y: String}

与以下相同

alias Int32StringNamedTuple = NamedTuple(x: Int32, y: String)

在常规代码中,{x: Int32, y: String} 是一个命名元组实例,包含 Int32String 分别用于 xy。这不同于上面的命名元组 **类型**。

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)