相关疑难解决方法(0)

如何动态添加类属性?

如何动态地向类添加属性?我尝试了此操作,但是它抱怨缺少方法,因此我不确定为什么,因为我没有尝试添加方法。

use v6.d;

class Foo does Metamodel::AttributeContainer {
    submethod BUILD(:$attr) {
        my $a = Attribute.new(:name($attr), :type(Str), :package(Foo));
        self.add_attribute(self, $a);
    }
}

my Foo $foo = Foo.new(:attr('bar'));
$foo.bar = 'baz';  # No such method 'bar' for invocant of type 'Foo'
say $foo.bar;
Run Code Online (Sandbox Code Playgroud)

metaprogramming perl6 raku

9
推荐指数
1
解决办法
156
查看次数

使用环境变量构建配置类的更简洁方法?

我有一个Configuration读取环境变量的类:

class Configuration {
    has $.config_string_a;
    has $.config_string_b;
    has Bool $.config_flag_c;

    method new() {
        sub assertHasEnv(Str $envVar) {
            die "environment variable $envVar must exist" unless %*ENV{$envVar}:exists;
        }

        assertHasEnv('CONFIG_STRING_A');
        assertHasEnv('CONFIG_STRING_B');
        assertHasEnv('CONFIG_FLAG_C');

        return self.bless(
            config_string_a => %*ENV{'CONFIG_STRING_A'},
            config_string_b => %*ENV{'CONFIG_STRING_B'},
            config_flag_c => Bool(%*ENV{'CONFIG_FLAG_C'}),
        );
    }
}

my $config = Configuration.new;

say $config.config_string_a;
say $config.config_string_b;
say $config.config_flag_c;
Run Code Online (Sandbox Code Playgroud)

是否有更简洁的方式来表达这一点?例如,我在检查中重复环境变量名称和构造函数的返回值.

我可以很容易地看到编写另一个更通用的类,它封装了config参数的必要信息:

class ConfigurationParameter {
    has $.name;
    has $.envVarName;
    has Bool $.required;

    method new (:$name, :$envVarName, :$required = True) {
        return self.bless(:$name, :$envVarName, :$required); …
Run Code Online (Sandbox Code Playgroud)

perl6

7
推荐指数
2
解决办法
138
查看次数

使用Metamodel :: ConcreteRoleHOW.new_type时出错

似乎没有在MetamodelConcreteRoleHOW中使用new_type的方法,顾名思义,该方法应用于创建Role的新实例。主要问题是当您尝试混合新角色时,如签名(method new_type(:@roles, :$name = '<anon>', :$ver, :$auth, :$repr, :$api))所示:

my $a = Metamodel::ConcreteRoleHOW.new_type(name => "Bar", roles => [Iterable]);
$a.^compose;
say $a.^roles;
# Error: «Cannot iterate object with P6opaque representation (Array)?
Run Code Online (Sandbox Code Playgroud)

使用another Positional(一个列表)会产生不同的错误:

my $a = Metamodel::ConcreteRoleHOW.new_type(name => "Bar", roles => (Iterable));
$a.^compose;
say $a.^roles
# « Cannot iterate over a Iterable type object?»
Run Code Online (Sandbox Code Playgroud)

打我,我在那里可以使用哪种位置。可以肯定的是,这是在NQP中实现的,因此也许我应该定义一个NQP数组。但是我真的不知道。任何帮助将不胜感激。

编辑。首先,调用时会发生错误compose。其次,您必须有效地使用Raiph所说的NQP阵列

use nqp;
my $roles := nqp::list(Iterable);
my $a = Metamodel::ConcreteRoleHOW.new_type(name => "Bar", roles => $roles); …
Run Code Online (Sandbox Code Playgroud)

perl6 nqp

5
推荐指数
0
解决办法
78
查看次数

标签 统计

perl6 ×3

metaprogramming ×1

nqp ×1

raku ×1