BUILD 和 TWEAK 的区别
— 焉知非鱼Difference Between Build and Tweak in Raku
class Student {
has $.name;
has $.sex;
has $!age;
method BUILD(:$!name) {
}
}
my $stu = Student.new(:name('赵今麦'), :sex('女'));
dd $stu;
# Student $stu = Student.new(name => "赵今麦", sex => Any)
如果你加上 BUILD
方法, 你必须自己全权负责设置所有的东西。也就是既包括公共属性, 也包括私有属性。
但你可以通过巧妙地命名参数来让你的生活更轻松。
method BUILD (:$!name, :$!sex, :$!age) { }
BUILD
方法可以初始化私有属性:
class Student {
has $.name;
has $.sex;
has $!age;
method BUILD(:$name, :$sex, :$age) {
$!name = $name;
$!sex = $sex;
$!age = $age;
}
method heart() { return '♥ ' ~ $!age }
}
my $stu = Student.new(:name('赵今麦'), :sex('女'), :age(18));
dd $stu;
say $stu;
say $stu.heart();
也可以在 TWEAK 方法中初始化私有属性:
class Student {
has $.name;
has $.sex;
has $!age;
method TWEAK(:$name, :$sex, :$age) {
$!age = $age + 1;
}
method heart() { return '♥' ~ $!age }
}
my $stu = Student.new(:name('赵今麦'), :sex('女'), :age(18));
dd $stu;
say $stu;
say $stu.heart();
使用 TWEAK
,你会得到与 BUILD
相同的参数,但所有的初始设置都已经完成了(BUILD
或公共属性的自动绑定,以及所有的默认值,再加上保证所需值的存在)。你只是有机会做一些最后的调整。