有没有一种直接的方法来检查某个东西是否是 mixin?

jjm*_*elo 5 mixins raku

Raku mixin有两种(或更多)性质,在同一个容器中组合多个值,或者值与角色。但是,据我所知,没有一种直接的方法可以检查不是由您创建的变量中的“混合性”。

这可能是个伎俩

my $foo = 3 but Stringy;
say $foo.^name ~~ /\+/;# OUTPUT: «?+??»
Run Code Online (Sandbox Code Playgroud)

但是我还缺少其他任何可以直接查找的属性吗?

Eli*_*sen 6

我认为您缺少^roles^parents元方法:

my $foo = 3 but Stringy;
dd $foo.^roles;   # (Stringy, Real, Numeric)
dd $foo.^parents; # (Int,)
Run Code Online (Sandbox Code Playgroud)


rai*_*iph 5

TL;DR我不可靠的解决方案[1]比不可靠的解决方案[2]更简单、更快,应该适用于问题 Y 和问题 X [3]

sub is-mixin ($object) { $object.^is_mixin =:= 1 }
say is-mixin 3;           # False
say is-mixin 3 but 'bar'; # True
Run Code Online (Sandbox Code Playgroud)

脚注

[1] “警告:[role Metamodel::Mixins] 是 Rakudo 实现的一部分,而不是语言规范的一部分。”

[2]我没有搜索过烤,但可以想象使用+in 类型名称只是一种约定,而不是语言规范的一部分。

[3]根据我在下面的第一条评论,我发现您的问题是XY 问题的一个示例;和/或术语混乱,每秒。这个答案的其余部分解释了我的意思。

有没有一种直接的方法来检查容器是否是 mixin?

“容器”这个词在 Raku 中具有技术含义。它指的是遵循 Raku 的容器协议的值。当一个值后跟=调用“赋值”时,容器协议适用。

您所问的似乎与这样的容器无关,因为它与值不同。并且有充分的理由认为这对你来说无关紧要——你只是感兴趣的是测试一个值是否是一个混入,而“容器”方面是一个红鲱鱼,要么是因为你没有意思是 Raku 中通常意义上的“容器”,或者因为容器一个值所以它并不重要,所以任何用于测试值的方法都可以用于测试容器。

例如,看看你的“伎俩”:

my $foo = 3 but Stringy;
say $foo.^name ~~ /\+/;# OUTPUT: «?+??»
Run Code Online (Sandbox Code Playgroud)

这个技巧与使用 Raku 中“容器”一词的正常技术用法的任何容器方面无关。如果您编写以下不涉及容器的内容,您会得到相同的结果:say (3 but Stringy).^name ~~ /\+/;# OUTPUT: «?+??».

因此,在我的解决方案中,我假设您的意思只是一个value,知道您的最终关注点是否在容器上实际上并不重要。

如果我的假设是错误的,并且它有所作为,我敦促您解释您正在尝试做的事情的 X,而不仅仅是 Y。