oop - 为对象的 BUILD 移相器中的属性赋值

标签 oop raku

BUILD调用移相器,它会覆盖 Perl6 中的默认属性分配。假设我们必须使用 BUILD 移相器,就像我们在 this module 中所做的那样(这就是我遇到这个问题的地方)。在那个阶段为属性赋值的方法是什么?
我用过这个

class my-class {
    has $.dash-attribute;

    submethod BUILD(*%args) {
        for %args.kv -> $k, $value {
            self."$k"( $value );
        }
    }
};

my $my-instance = my-class.new( dash-attribute => 'This is the attribute' );

我得到这个错误
Too many positionals passed; expected 1 argument but got 2
$!的其他组合或 $. ,直接赋值,将属性声明为 rw (相同的错误)产生不同类型的错误。这可能只是一个语法问题,但我找不到解决方案。任何帮助将不胜感激。

最佳答案

在你的例子中有两件事是错误的,我是这么看的。首先,如果你想要一个属性是可写的,你需要标记它is rw .其次,改变属性的值是通过赋值来完成的,而不是通过将新值作为参数给出。

所以我认为代码应该是:

class my-class {
    has $.dash-attribute is rw;

    submethod BUILD(*%args) {
        for %args.kv -> $k, $value {
            self."$k"() = $value;
        }
    }
};

my $my-instance = my-class.new( dash-attribute => 'attribute value' );
dd $my-instance;
# my-class $my-instance = my-class.new(dash-attribute => "attribute value")

关于oop - 为对象的 BUILD 移相器中的属性赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334689/

相关文章:

python - 类和函数范围

enums - raku 类型枚举不适用于自定义类型

raku - Perl6可选功能标志

c# - 在 RavenDB 中指定集合名称

java - 关于类中类的 OOP 相关问题

date - 在 Perl 6 中查找上周五的日期?

乐跑 ('find .' , :out); not working on MacOS

raku - 馈送运算符(operator)管道的行为

c# - 如何在不知道提前指定数量的情况下创建对象数组

java - 如何在类之间高效共享函数而不违反里氏替换原则