gpt4 book ai didi

object - 如何在 Raku 中动态访问对象中的属性

转载 作者:行者123 更新时间:2023-12-03 18:33:51 24 4
gpt4 key购买 nike

我想知道如何通过 Str 的名称动态访问对象的属性在运行时 Raku .代替:

#!/usr/bin/rakudo                                                                                                                                                                    

class c0 {
has $!a0 = 1;
has $!a1 = 2;
method access(Str $m) {
if ($m eq "a0") { return $!a0; }
if ($m eq "a1") { return $!a1; }
}
method set(Str $m, $v) {
if ($m eq "a0") { $!a0 = $v; }
if ($m eq "a1") { $!a1 = $v; }
}
}

my $c = c0.new();
$c.set("a0", 3);
$c.set("a1", 4);
say $c.access("a0");
say $c.access("a1");
我想使用一些看起来像伪代码的东西:
class c0 { 
...
method access(Str $m) {
return self.$m;
}
method set(Str $m, $v) {
self.$m = $v;
}
}

Raku 中是否有可能? ?我需要使用哪个构造?
作为背景调查人员,我正在考虑如何实现一个角色,为类添加关联功能,以透明地访问成员。属性名称将被参数化:如果我有一个类 class ports { has @!ports_; ... }和一个实例 my $p = ports.new() 然后我希望能够使用下标语法通过 $p[...] 访问 @ports_ 。我试图找出我可以定义的天气 role acc [ Str $member] does Associative[Cool,Str] { ... }然后通过 class ports does acc["ports_"] { ... } 定义端口 AT-KEYEXISTS-KEYrole acc使用动态属性访问(如果可能的话)实现。
我不想使用“EVAL”。

最佳答案

这可以通过对属性的一些内省(introspection)来实现。但是,我想指出,私有(private)属性的确切意图是私有(private)的。创建一种解决方法将它们作为公共(public)属性处理是一种反模式,并引入了不必要的复杂性。

class c0 {
has $.a0 = 1;
has $.a1 = 2;

method access (Str $m) {
my $attribute = self.^attributes.first({ ~$_ eq '$!' ~ $m });

return unless $attribute;

$attribute.get_value(self); # 1
}
}

my $c = c0.new;

say $c.access('a0');
要设置该值,您可以使用 .set_value属性上的方法。
method set (Str $m, $v) {
...

$attribute.set_value(self, $v);
}

出于历史目的,旧答案留在这里。
是的,这样的事情在 Raku 中是可能的。您甚至不需要显式定义 access方法。
class c0 {
has $.a0 = 1;
has $a.1 = 2;
}

my $c = $c0.new;

say $c.'a0'(); # 1
这是因为 Raku 为您的类创建了一个公共(public)变量的访问器方法,当您使用 .'a0'() 时会调用该方法。 . ()使用带引号的方法名称是必需的。

关于object - 如何在 Raku 中动态访问对象中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63055923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com