针对此问题/答案,perl6 multi默认为sub。
No such method <name> for invocant of type <class>
我希望它默认为method。请有人能解释这个理由吗?
答案 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)
多声明符(multi
,proto
或only
)后面没有其他某种声明符,而是例程名,它通常是{ {1}}声明符。
Perl 6热衷于词法作用域,尤其热衷于使代码易于重构。
以最短的方式声明sub
采取最狭窄范围的选项-词法范围-鼓励保持事物尽可能狭窄的范围。
在没有声明符的情况下制作multi
具有一致的含义,因为它允许人们放心地将代码移到所需的最窄范围,从而有助于重构。突然改变它的意思是仅仅因为它被移到multi
中就会造成重构的挫败。
最后,值得注意的是,Perl 6中的class
可以被视为与其他各种语言中的sub
一样,因此多重分发通常很有用,因此多重分发{{因此1}}在private static
主体内部很有用。
有时特殊情况是合理的。像自然语言一样,Perl 6会在真正值得的时候使用它们,但默认情况是避免使用它们。 sub
的论点在class
(可能是multi
)内部还意味着其他东西,对于特殊情况而言,还不够强大。