为什么perl6 multi默认为sub?

时间:2018-07-14 20:46:36

标签: perl6 dispatch

针对此问题/答案,perl6 multi默认为sub。

No such method <name> for invocant of type <class>

我希望它默认为method。请有人能解释这个理由吗?

2 个答案:

答案 0 :(得分:6)

sub可以出现在任何地方,并且默认为词法作用域规则(my)。
方法通常仅在类定义中出现,并且默认情况下将其范围限定为类(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
}

由于子可以并且确实发生在所有地方,因此multi暗示子而不是方法更有意义。

尽管您可能认为multi在类定义中隐含一个方法是有意义的;这样可以使multi根据上下文隐含两个不同的事物(两次)。这意味着my sub在类外部,has method在类内部。 (它也将返回到类内部方法中的my sub内。)

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

答案 1 :(得分:6)

多声明符(multiprotoonly)后面没有其他某种声明符,而是例程名,它通常是{ {1}}声明符。

Perl 6热衷于词法作用域,尤其热衷于使代码易于重构。

以最短的方式声明sub采取最狭窄范围的选项-词法范围-鼓励保持事物尽可能狭窄的范围。

在没有声明符的情况下制作multi具有一致的含义,因为它允许人们放心地将代码移到所需的最窄范围,从而有助于重构。突然改变它的意思是仅仅因为它被移到multi中就会造成重构的挫败。

最后,值得注意的是,Perl 6中的class可以被视为与其他各种语言中的sub一样,因此多重分发通常很有用,因此多重分发{{因此1}}在private static主体内部很有用。

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