【问题标题】:Perl6: Sub: restrict to static hash-return typePerl6:Sub:限制为静态哈希返回类型
【发布时间】:2018-03-09 23:38:03
【问题描述】:

我想在 Perl6 中限制我的一些函数的返回类型。 我知道,如何推断函数的正确返回类型,在 Perl6 中返回标量或数组,但我不知道,如果我使用特定类型的哈希作为返回值,我该怎么做?

示例:Array 方法可以在test_arr() 中看到,Hash 方法可以在test_hash() 中看到。所以我想指定test_hash()的返回值,返回一个A类的hash。

#!/usr/bin/env perl6
use v6.c;
use fatal;

class A { 
    has Str $.member;
}

sub test_arr() returns Array[A] {
    my A @ret;
    @ret.push(A.new(member=>'aaa'));
    return @ret;
}

sub test_hash() { #TODO: add `returns FANCY_TYPE`
    my A %ret;
    %ret.append("elem",A.new(member=>'aaa'));
    %ret.append("b",A.new(member=>'d'));
    return %ret;
}

sub MAIN() returns UInt:D {
    say test_arr().perl;
    say test_hash().perl;
    return 0;
}

【问题讨论】:

    标签: raku


    【解决方案1】:

    其实跟数组是一样的:

    sub test_hash() returns Hash[A] {
        my A %ret;
        %ret.append("elem",A.new(member=>'aaa'));
        %ret.append("b",A.new(member=>'d'));
        return %ret;
    }
    

    注意你也可以写%ret<elem> = A.new(...)

    更新:对于A数组的哈希,你需要做的事情基本相同,你只需要在每一步都明确说明类型:

    sub test_hash() returns Hash[Array[A]] {
        my Array[A] %ret;
        %ret<elem> = Array[A].new(A.new(member => 'aaa'));
        return %ret;
    }
    

    但不要夸大其词; Perl 6 不像 Haskell 那样强类型化,并且试图表现得好像它不会带来良好的编码体验。

    【讨论】:

    • 好的,谢谢您的回答。但是现在我得到了另一个问题:A 数组的哈希值呢? sub test_hash_of_array() 返回 Hash[Array[A]] { my %ret; %ret.append("elem",[]); %ret{"elem"}.push(A.new(member=>'d'));返回 %ret; } 因为这不起作用。
    • @byteunit 我已经更新了我的答案以包含一个Hash[Array[A]] 示例,因为它不容易放入评论中。
    • 感谢您的示例。
    猜你喜欢
    • 2015-07-22
    • 2023-03-31
    • 2021-07-01
    • 1970-01-01
    • 2018-01-17
    • 2013-02-13
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多