gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:48:02 24 4
gpt4 key购买 nike

我对这个问题的假设是,我指定的签名完全描述了方法将接受的所有内容。显然我错了,但我还是想得到那个。如果我没有在签名中指定它,我不希望其他人能够提供它作为认为它会做某事的论据。

我为一个方法创建了一个带有单个位置参数的签名,并且我希望它只接受一个位置参数。然而,它也毫无怨言地接受命名参数:

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

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

但是,如果我定义了一个采用命名参数的方法,那么每次我第二次定义它时都会调用它。另外,虽然我认为我已经说过它需要一个命名参数 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 决定检查方法的顺序是什么?
  • 最佳答案

    您正在触及关于多方法调度的最难掌握的事情之一。要意识到的最重要的事情是,每个 method签名有一个隐含的 *%_ (又名 slurpy 哈希)如果没有指定。这意味着它将吃掉任何非特定的命名参数。

    class A {
    method a() { dd %_ } # %_ exists even if not specifically specified
    }
    A.a(:foo) # {:foo}

    您需要意识到的第二件事是,命名参数仅充当决胜局。因此,如果有多个候选人具有相同的匹配位置参数集,MMD 将使用第一个有效的(考虑到所有意外的命名参数都被 %_ slurped):
    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

    如果你有候选人采用多个命名参数,它很快就会变得相当复杂,你可能最好只使用一个使用内省(introspection)的方法 %_ :
    class A {
    method a() {
    if %_<foo> {
    say "foo"
    }
    elsif %_<bar> {
    say "bar"
    }
    else {
    die "None of the signatures matched"
    }
    }
    }
    A.a(:bar) # bar

    希望这能让事情更清楚:-)

    关于signature - 如何指定包含我接受的所有内容并排除其他所有内容的 Perl 6 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491646/

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