【问题标题】:Are typed signatures for stubbed methods not enforced in roles for Perl6?Perl6 的角色中是否没有强制执行存根方法的类型签名?
【发布时间】:2018-10-17 18:43:14
【问题描述】:

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

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

示例脚本:

#!/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 的方式来做我想做的事......

【问题讨论】:

标签: raku rakudo


【解决方案1】:

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

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

我不知道为什么会这样。

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

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2014-06-08
    • 2019-08-14
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多