rakulang, dartlang, nimlang, golang, rustlang, lang lang no see

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 或公共属性的自动绑定,以及所有的默认值,再加上保证所需值的存在)。你只是有机会做一些最后的调整。