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
}
Run Code Online (Sandbox Code Playgroud)
由于sub可以并且确实发生在任何地方,因此multi暗示sub而不是方法更有意义.
虽然您可能认为multi在类定义中暗示一个方法是有意义的; 这将使它multi意味着两个不同的东西(第二次)取决于上下文.这意味着my sub在课堂之外和课堂之has method内.(它也会回到类my sub内部的方法内部.)
那将是一个特例.Perl 6的设计目标之一是减少特殊情况的数量.
一个多声明符(multi,proto或only)后面没有其他类型的声明符,而是一个例程名称,对于sub声明符来说总是很短的.
Perl 6热衷于词法范围,特别热衷于使代码易于重构.
以最短的方式宣布multi采用最狭隘范围的选项 - 词法范围 - 鼓励尽可能缩小范围.
multi通过允许人们自信地将代码移动到需要它的最窄范围,没有声明符的制作具有一致的意义帮助重构.让它突然改变意义只是因为它被移动到一个class将是一个重构挫折.
最后,值得注意的是sub,Perl 6可以被视为填充与private static其他语言相同的利基,多重调度通常是有用的,因此多重调度sub因此可以在class身体内部使用.
有时特殊情况是合理的.就像自然语言一样,Perl 6会在真正值得的时候制作它们,但默认是避免使用它们.在一个特殊情况下,对于一个(并且可能是)multi内部的其他东西的含义的论证并不够强.classrole