Jac*_*kXu 12 perl class object
在学习其他语言时,类方法和对象方法之间通常存在差异.
我知道,在Perl中,班级很弱.类方法和对象方法之间是否也有区别?
我知道最常用的类方法可能是类的new
方法.在Perl中,我可以使用包名称调用所有方法,但不能调用包的对象.这是为什么?
Tim*_*rce 12
该perlobj
手册页是有帮助的位置:
当您调用方法时,箭头左侧的东西将作为方法的第一个参数传递.这意味着当我们调用时
Critter->new()
,该new()
方法接收字符串"Critter"
作为其第一个参数.当我们调用时$fred->speak()
,$fred
变量作为第一个参数传递给speak()
.
换句话说,Perl没有在类方法和实例方法之间做出明确的区分.它们通过作为方法的第一个参数传递的内容来区分,并且如果某些方法实际上没有关心作为第一个参数传递的内容,那么你可以欺骗并称它们为"错误"的方式.
Perl不在乎.它通常不会.
@ qwrrty的回答是对这种情况的一个很好的解释,但是从评论中我得到的印象是即使Perl对对象和类方法没有什么区别,@ JackXu也希望有这样的区别.
如果要进行这样的区分,那么解决方案是检查$_[0]
它是对象还是字符串,并且表现得恰当(例如,如果使用类名作为第一个参数调用对象方法,则抛出异常).
CPAN上有各种方法签名模块,这使得这很容易做到,其方式如下:
package Foo;
method xxx (Object $self: Int $x) {
...;
}
Foo->xxx(1); # throws an error because "Foo" is not an object
Run Code Online (Sandbox Code Playgroud)
我要皮条客我自己对这种事情的解决方案- Moops,它不仅给你的方法签名,但也关键字class
,role
等在这里拉皮条它的具体原因是由于其支持"多方式" ,您甚至可以创建一个具有相同名称的类方法和对象方法!
use Moops;
class Foo
{
multi method xxx (ClassName $class: Int $x) {
say "CLASS METHOD - value $x";
}
multi method xxx (Object $self: Int $x) {
say "OBJECT METHOD - value $x";
}
}
Foo->xxx(1);
my $foo = Foo->new;
$foo->xxx(2);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3288 次 |
最近记录: |