使用类

一旦我们定义了一个类并提供了一些实例,我们就可以将该类用于这些实例。有几种方法可以做到这一点。

限定名

可以使用完全限定名访问类方法:

println$ Eq[int]::==(1, 2);
println$ Eq[int]::eq(1, 2);
println$ Eq[double]::eq(1.1, 2.2);

当可以通过重载解析推导出类型时,可以省略该类型:

println$ Eq::==(1, 2);
println$ Eq::eq(1, 2);

缺少实例

如果尝试使用尚未由实例为所用类型定义的方法,则将获得 实例化错误 . 这不是类型错误,它只是表示您忘记提供该类型的实例:

// println$ Eq::==("Hello", "World");
// WOOPS! we didn't defined it for strings

打开一个类

使用类的最简单方法是打开它:

open Eq;
println$ eq(1,2);
println$ 1 == 2;
println$ 1.1 == 2.2;

这是脚本最常用的方法。事实上,标准库中的许多类已经为您打开。

开设专业课

也可以开设一个专业课程:

open Eq[int];
println$ eq(x,y);
println$ x == y;
// println$ 1.1 == 2.2;
// WOOPS, can't find == for double * double

这不是实例化错误,double的实例存在。问题是我们没有为double打开Eq,只为int。

将类传递给函数

您还可以将类或专业化传递给函数。下面是一个单态的例子:

fun eq3[with Eq[int]] (x:int, y:int, z:int) =>
  x == y and y == z
;

这与在函数内部打开类或专业化完全相同。它很有用,因为它通过函数抽象隔离了对类的访问。

下面是一个多态性示例:

fun eq3[T with Eq[T]] (x:T, y:T, z:T) =>
  x == y and y == z
;