加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何指定包含我接受的所有内容的Perl 6签名并排除其他所有内容?

发布时间:2020-12-15 21:55:00 所属栏目:大数据 来源:网络整理
导读:我在这个问题中的假设是,我指定的签名完全描述了方法将接受的所有内容.显然我错了,但无论如何我想要那样做.如果我没有在签名中指定它,我不希望其他人能够提供它作为一个认为它会做某事的论据. 我为方法创建了一个带有单个位置参数的签名,我希望它只接受单个
我在这个问题中的假设是,我指定的签名完全描述了方法将接受的所有内容.显然我错了,但无论如何我想要那样做.如果我没有在签名中指定它,我不希望其他人能够提供它作为一个认为它会做某事的论据.

我为方法创建了一个带有单个位置参数的签名,我希望它只接受单个位置参数.但是,它也接受命名参数而无需投诉:

class SomeClass {
    method something ( Int $n ) { 'Ran something' }
    }

put SomeClass.something: 137; # Ran something
put SomeClass.something: 137,:foo('bar'); # Ran something

但是,如果我定义一个采用命名参数的方法,那么每次我定义它时都会调用它.此外,虽然我认为我已经说过它需要一个名为paramter foo,但它不是必需的,它仍然接受我没有指定的命名参数:

class SomeClass {
    multi method something ( Int $n ) { 'Ran something' }
    multi method something ( Int $n,:$foo ) { "Ran $foo" }
    }

put SomeClass.something: 137;  # Ran
put SomeClass.something: 137,:foo('bar'); # Ran bar
put SomeClass.something: 137,:bar('foo'); # Ran

所以,有些问题:

>如何指定包含我想接受的所有内容的签名并排除其他所有内容?
>如何强制Perl 6选择最接近的匹配签名?
> Perl 6以什么顺序决定检查方法?

解决方法

您正在谈论有关多方法调度最难掌握的事情之一.最重要的是要实现每个方法签名都有一个隐含的*%_(也就是一个slurpy哈希),如果没有指定的话.这意味着它将吃掉任何非特定的命名参数.
class A {
    method a() { dd %_ }  # %_ exists even if not specifically specified
}
A.a(:foo)   # {:foo}

您需要意识到的第二件事是,命名参数只能起到打破平局的作用.因此,如果有多个候选者具有相同的位置参数匹配集,MMD将使用第一个有效的候选者(考虑到所有意外的命名参数都被%_ sl):

class A {
    multi method a(:$foo) { say "foo" }
    multi method a(:$bar) { say "bar" }
}
A.a(:bar)    # foo

这个看似意外的结果是由以下事实引起的:

>两个候选人具有相同数量的位置参数
>第一个候选匹配因为:$foo是可选的
>和:bar被隐含的*%_吃掉

为了使它更像您期望的工作,您需要将需要打破的候选项放入您希望它们触发的顺序,并使任何命名参数成为必需参数:

class A {
    multi method a(:$foo!) { say "foo" }
    multi method a(:$bar!) { say "bar" }
}
A.a(:bar)    # bar

如果您有候选者采用多个命名参数,它很快就会变得相当复杂,只要有一个使用%_的内省的方法,你可能会更好:

class A {
    method a() {
        if %_<foo> {
            say "foo"
        }
        elsif %_<bar> {
            say "bar"
        }
        else {
            die "None of the signatures matched"
        }
    }
}
A.a(:bar)    # bar

希望这会让事情更加清晰:-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读