gpt4 book ai didi

raku - Perl6 的角色中没有强制执行 stub 方法的类型签名吗?

转载 作者:行者123 更新时间:2023-12-04 02:18:11 25 4
gpt4 key购买 nike

我正在尝试用 Perl6 做一些 OOP 并且在角色方面遇到了一些麻烦。我试图以与 Java 接口(interface)类似的方式使用它们,在那里我只有方法签名,必须由任何扮演该角色的类实现。我正在使用带有类型参数并返回的 stub 方法。

我注意到类型签名没有被强制执行,只有方法的名称。

示例脚本:

#!/usr/bin/env perl6
use v6;

role MyRole {
method intAdder( Int $a, Int $b --> Int ) { ... }
}

# this does the role and the method signature matches
class MyClass1 does MyRole {
method intAdder( Int $a, Int $b --> Int ) { return $a+$b }
}

# this does the role and the method signature does NOT match
# why is this allowed?
class MyClass2 does MyRole {
method intAdder( Str $a --> Str ) { return "Hello, $a." }
}

# this does the role and the method name does not match and gives an error as expected:
# Method 'intAdder' must be implemented by MyClass3 because it is required by roles: MyRole.
#
# class MyClass3 does MyRole {
# method adder( Int $a, Int $b --> Int ) { return $a+$b }
# }

sub MAIN() {
my $object1 = MyClass1.new;
my $object2 = MyClass2.new;
say $object1.intAdder: 40, 2;
say $object2.intAdder: 'world';
}

# output:
# 42
# Hello, world.

我已经阅读了官方文档中的面向对象页面,但找不到一种方法来做我想做的事......我也在尝试应用一种 Java 方式来思考 OOP 和打字,也许有不同的,更多Perl6ish 做我想做的事...

最佳答案

如果您使用 multi method 声明方法在角色中,然后 P6 强制存在 multi method在具有匹配签名的消费者中。 (它也允许其他签名。)

如果省略 multi在角色中,P6 不强制签名,只是在消费者中声明了具有匹配名称的方法。

我不知道为什么它会这样工作。

2020年更新参见 my answer to SO "Signature restriction in roles in raku" 中我的评论开头“我认为设计意图是支持多态组合的两种概念”。 . (2020 年的问题是这个问题的欺骗,但我不记得这个问题,不幸的是我搜索时也没有找到。)

关于raku - Perl6 的角色中没有强制执行 stub 方法的类型签名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52861619/

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