21 May 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

Perl 6 中引进了类型(Type). 当然,你也可以像 Perl 5 一样不使用这东西。但类型所带来的诱惑是不能抵挡的。

Perl 6 中内建的对象类型以大写字母开头:Int, Num, Str, Bit, Ref, Scalar, Array, Hash, Rule 和 Code.
非对象(值)类型全是小写字母:int, num, str, bit, 和 ref.

指定变量的类型

在 Perl 5 中你没有(简单的)方法来生成一个只能存储数字的标量或生成一个引用只指向 Dog 这个类的对象。
同样的,你也很难生成一个只能含字符串的数组或是指定一个散列的值只能是数字数组的引用。
在 Perl 6 中,这种指定将变得非常简单。
my Int $number;
my Dog $obj_ref;
my Str @strings;
my Array of Num %counters;
看看下面的例子:
my int @array is MyArray;
它的意思是你声明了 @array 里的元素都为整数,而这个数组本身是一个 MyArray 类。

类型在子程序里的应用

sub Num mean(Int @vals) {
  return sum(@vals)[email protected];
}
指定 mean 函数接受一个整数数组并返回一个数。你也可以这么写:
sub mean(Int @vals) returns Num {
   return sum(@vals)[email protected];
}
我们进一步扩展这功能,要求返回的是数组,并且数组里的元素只能是整形:
sub hist(Int @vals) returns Array of Int {
  my Int @histogram;
  for @vals { @histogram[$_]++ }
  return @histogram;
}
这里我们用 of 来生成了一个复合类型。“内部类型”(of 后面)指定了“外部类型”(of 后面)的数据存储类型。

传递多个数组

在 Perl 5 中传递多个数组我们一般都得用引用。如
sub func {
    my ($a_ref, $b_ref) = @_;
    my @a = @$a_ref;my @b = @$b_ref;

    # &func(\@a, \@b);
在 Perl 6 中可以直接传递多个数组,下面的例子是可行的:
sub func (Array @a, Array @b) {
    say [email protected], [email protected];
}

my @a1 = (1,2,3);
my @a2 = (4,5,6,7);

&func(@a1, @a2); # 3,4
散列也一样,用 Hash %hash 就能传递整个散列。
甚至我们可以省略 sub func (Array @a, Array @b) 里的 Array, Perl 6 会自动搞定。
不过请注意:省略类型 Array 的话,我们传递两个标量参数给 func 时是不会报错的。

Am I correct?

It's not finished. I'll add something later.


blog comments powered by Disqus