为什么 perl6 multi 默认为 sub?

Why does perl6 multi default to sub?

参考这个问题/答案,perl6 multi默认为sub。

我原以为它会默认为方法。请有人解释一下这样做的理由吗?

sub 可以出现在任何地方并且默认为词法范围规则 (my)。
方法通常仅出现在 class 定义中,并且默认范围为 class (has).

my multi sub foo (){…}
multi foo (){…} # identical

my multi method foo (){…} # must be forced to my declaration


class :: {
  my multi sub foo (){…}
  multi foo (){…} # identical

  has multi method bar (){…}
  multi method bar (){…} # identical
}


sub :: () {
  my multi sub foo (){…}
  multi foo (){…} # identical

  my multi method foo (){…} # must be forced to my declaration
}

method :: () {
  my multi sub foo (){…}
  multi foo (){…} # identical

  my multi method foo (){…} # must be forced to my declaration
}

由于 sub 可以而且确实无处不在,因此 multi 暗示 sub 而不是 method 更有意义。

虽然您可能认为 multi 在 class 定义中暗示一个方法是有意义的;这将使 multi 根据上下文暗示两种不同的事物(乘以两次)。这意味着 my sub 在 class 之外,has method 在 class 之内。 (它还会返回到 class 内的方法内的 my sub。)

那就是特例。 Perl 6 的设计目标之一是减少特殊情况的数量。

多声明符(multiprotoonly)后面没有其他类型的声明符,而是例程名称,将始终是以下的缩写sub 声明符。

Perl 6 热衷于词法范围界定,尤其热衷于使代码易于重构。

以最短的方式声明一个 multi 采用范围最窄的选项 - 词法范围 - 鼓励尽可能缩小范围。

使没有声明符的 multi 具有一致的含义有助于重构,因为它允许人们自信地将代码移动到所需的最窄范围内。仅仅因为它被移动到 class 中而突然改变意义将是重构的挫败感。

最后,值得注意的是,Perl 6 中的 sub 可以看作是填补了与其他各种语言中的 private static 相同的利基市场,多重分派通常很有用,因此多重分派sub 因此在 class 主体内很有用。

有时特殊情况是合理的。与自然语言一样,Perl 6 会在 真正 值得时使用它们,但默认设置是避免使用它们。 multi 的论点意味着 class(并且可能是 role)中的其他内容对于特殊情况而言还不够强大。