彩世界平台注册网站 > 历史资讯 > 来自国际民俗摄影“人类贡献奖”年赛组委会的

原标题:来自国际民俗摄影“人类贡献奖”年赛组委会的

浏览次数:118 时间:2019-10-18

后天,7个甲级民俗水墨画国际评选委员会委员已齐聚羊城! 

Conclusion

后天,大家学到了部分强盛的例程,让你能够从别的候选人中选用现存的七个候选人。 callsamecallwith 允许你调用当前调节链中的下八个金童玉女候选者,使用同样的参数或新集合。nextsamenextwith 完结一样的事务,而不重返到调用现场。

samewith 子让你从头初阶重新起动调整链,而没有须求领会当前例程的称谓。而 lastcallnextcallee 能够透过截断当前的调整链,恐怕移出和操作下贰个被调用者来操作当前的调解链。

杰出利用它们啊!

-Ofun

原文:

Perl6-But-Heres-My-Dispatch-So-Callwith-Maybe

  “尊驴奖”—— 2009中国户外运动行当年度评选活动自运营以来,受到了网上朋友的霸气关注,网络朋友的涉企踊跃度超过往届评选。本次评选本着公开、公平、公正的标准化,通过咱们评选委员会委员团和网络朋友投票的难得选择,评选出终极奖项。活动之间,室外国资本料网的采访编辑团队将对候选人举行详细考查和访问,并在晚期向评定审核团提供考察报告。最后,大盘点种种奖项候选者的末尾得分将由行家评定核查团评分、网络朋友投票和8264考查评分三某个组成,分别占总评分权重的十分六、十分之二和30%,具体评分准绳如下:

咱俩祝福全体的候选人好运

Last Call!

包中的结尾叁个方法是 lastcall。调用它截断当前的调治链,以便 next____call____ 例程不会有任何任哪儿方可去。以下是四个事例:

multi foo (Int $_) {
    say "Int: $_";
    lastcall   when *.is-prime;
    nextsame   when *  %% 2;
    samewith 6 when * !%% 2;
}
multi foo (Any $x) { say "Any $x" }

foo 6; say '----';
foo 2; say '----';
foo 1;

# OUTPUT:
# Int: 6
# Any 6
# ----
# Int: 2
# ----
# Int: 1
# Int: 6
# Any 6

笔者们具备的对 foo 的调用都会首先走入 Int 候选者。当数字为 .is-prime,大家调用 lastcall; 当它是三个偶数,我们调用 nextsame; 而当那是二个奇数时,大家使用 6 作为参数来调用samewith

咱俩调用 foo 的第二个数字是6,那不是素数,所以 lastcall 从不被调用。那是一个偶数,所以大家调用 nextsame,从出口大家看看,大家早已达到Any候选者。

接下去,当大家利用 2 调用 foo 时,那是二个素数和偶数,我们调用 lastcallnextcall。然而,因为 lastcall 被调用并截断了调解链,所以 nextcall 从不走访到 Any 候选者,所以大家唯有在输出中调用 Int 候选者。

在结尾一个事例中,大家再一次利用多个素数,所以 lastcall 再壹遍被调用。然则,数字是二个奇数,所以大家选拔 samewith 而不是 nextwith。由于 samewith 从头初始重新调解,它无所谓大家用 lastcall 截断了原先的链。由此,输出展现大家由此 Int 候选者一遍,第二次调用使用 nextsame 到达 Any 候选者,因为 samewith 上行使的数字不是素数,而是偶数。

  8264科学切磋评分环节,满分为30分。户外国资本料网采访编辑团队将对候选人进行详尽应用钻探和访问,最后在检察搜聚的底蕴上为候选人评分。

明日,七二十个大奖候选者什么人能冲奖成功?

什么人是下四个?

本条能让大家在调节链上抓住下一个相配的候选人的趁手的小人例程是 nextcallee。它不光再次回到该候选者的 Callable,何况它将其从链上移出,以便下一个 next____call____ 会步入下一个候选人,下一个 nextcallee 将会移出并赶回 next-next 候选者。所以, 让大家重回大家在此以前的事例, 作点弊!

class Wide             { }
class Middle is Wide   { }
class Narrow is Middle { }

subset    Prime where     .?is-prime;
subset NotPrime where not .?is-prime;

multi foo (Narrow   $v) { say 'Narrow    ', $v; 'from Narrow'   }
multi foo (Middle   $v) {
    say 'Middle    ', $v;

    nextcallee;
    my $result = callwith 42;
    say "We're back! The return value is $result";

    'from Middle'
}
multi foo (Wide     $v) { say 'Wide      ', $v; 'from Wide'     }
multi foo (Prime    $v) { say 'Prime     ', $v; 'from Prime'    }
multi foo (NotPrime $v) { say 'Non-Prime ', $v; 'from NotPrime' }

foo Middle;

# OUTPUT:
# Middle    (Middle)
# Non-Prime 42
# We're back! The return value is from NotPrime

啊哈!有用!代码差不离一模二样。独一的生成是我们在调用 callwith 在此之前弹出了 nextcallee 调用。它移除了不恐怕管理新的 42 参数的 Wide 候选者,所以,从输出能够见到,大家的调用步向了 NotPrime 候选者。

nexcallee 是杰出的,所以循环是三个挑战,因为它会选用循环或thunk的调节程序来寻觅被调用者。所以它最广泛和最简易的用法是获取...下贰个被调用者。即使您需求传递下三个被调用者, 你得先那样做:

multi pick-winner (Int s) {
    my &nextone = nextcallee;
    Promise.in(π²).then: { nextone s }
}
multi pick-winner { say "Woot! $^w won" }

with pick-winner ^5 .pick -> result {
    say "And the winner is...";
    await result;
}

# OUTPUT:
# And the winner is...
# Woot! 3 won

Int 候选者接收 nextcallee 然后开发银行贰个会被并行试行的 彩世界平台官网,Promise, 在逾期后归来。大家不能够在此时候使用 nextsame, 因为它会尝试 nextsame Promise 的代码块而非大家原来的子例程, 因而, nextcallee 节省了我们一全日时间。

自己想大家曾经到达了令人头眼昏花的例子的极限,小编能够听见观者的吵嚷。 “这种东西有何样用啊,反正?只是制作了越多的 subs, 实际不是无规律的 multis!“ 所以,让我们来拜会越来越多的实际世界的事例,以致接下来遇见的 nextsamenextwith

  以上多少个环节得分相加,即为候选者最终得分。本次大盘点种种奖项将以候选者最终得分为借助,评出最终结出,在大盘点先关页面发布。

主题

作者们要测量试验的前 5 个例程的命名遵从如下约定:

  • call____调用链中的下八个特别的候选人并赶回这里
  • next____ - 跳转到链中的下一个相当的候选人何况不回去这里
  • ____same - 使用 同一个参数就如用于当前候选者同样
  • ____with - 使用提供的这一个新参数进行操作
  • samewith - 从头开始一个同样的调用, 固守三个新的分派链, 使用这个新的参数並且回到这里

samesame 不是如何稀奇的东西, 这种状态最棒由健康循环代替。主要的外送食品是“call”,便是说你调用候选者并再次来到原地, 使用它的再次来到值或做越多的专业; “next”意味着前往下二个候选人,并选用其重临值作为当下候选者的重回值; 不过结尾的 samewith 仅仅调节你是或不是想要使用同样的参数就像是您在时下候选者中央银行使的那么, 可能提供四个新的成团。

让大家来娱乐这个东西呢!

  网络好朋友投票环节,满分为30分。候选者得分为30分乘以得票比例算出该环节得分。比方:某候选者在该奖项中得票比例为伍分叁,则候选者得分为30*40%=12分。

multi postfix:<!> (0) { 1 }
multi postfix:<!> (UInt n) { n × samewith n − 1 }

say 5!

# OUTPUT: 120

  评定审核团评分环节,满分为40分。本环节由评定核实团每位行家依据评定调查准绳对负有候选人逐条举办业评比分,行家评分相加后取平均分即为该候选者该环节得分。

Kicking It Up a Notch

大家会选用更加的多的 multies 和项目来扩大大家原本的例证:

class Wide             {}
class Middle is Wide   {}
class Narrow is Middle {}

subset Prime where .?is-prime;
subset NotPrime where not .?is-prime;

multi foo(Narrow   $v) { say 'Narrow   ', $v; 'from Narrow'  }
multi foo(Middle   $v) { say 'Middle   ', $v; 'from Middle'  }
multi foo(Wide     $v) { say 'Wide     ', $v; 'from Wide'    }
multi foo(Prime    $v) { say 'Prime    ', $v; 'from Prime'   }
multi foo(NotPrime $v) { say 'Non-Prime', $v; 'from Prime'   }

foo Narrow; # OUTPUT: Narrow    (Narrow)
foo Middle; # OUTPUT: Middle    (Middle)
foo Wide;   # OUTPUT: Wide      (Wide)
foo 42;     # OUTPUT: Non-Prime 42
foo 31337;  # OUTPUT: Prime     31337

咱俩本来的四个类都以 Any 类型况兼大家还创办了多个 Any 的子集(subset): PrimeNotPrime。其中 Prime 在类型上相配素数而 NotPrime 在档案的次序上非常不是素数的数字如故合作不含 .is-prime 方法的数字。因为大家的八个自定义类未有 .is-prime 方法, 所以它们都在品种上相称 NotPrime

比如大家应用这种新布局重新建立在此以前的例证, 我们会获得和事先同一的结果:

class Wide             { }
class Middle is Wide   { }
class Narrow is Middle { }

subset    Prime where     .?is-prime;
subset NotPrime where not .?is-prime;

multi foo (Narrow   $v) { say 'Narrow    ', $v; 'from Narrow'   }
multi foo (Middle   $v) {
    say 'Middle    ', $v;

    my $result = callwith Narrow;
    say "We're back! The return value is $result";

    'from Middle'
}
multi foo (Wide     $v) { say 'Wide      ', $v; 'from Wide'     }
multi foo (Prime    $v) { say 'Prime     ', $v; 'from Prime'    }
multi foo (NotPrime $v) { say 'Non-Prime ', $v; 'from NotPrime' }

foo Middle;

# OUTPUT:
# Middle    (Middle)
# Wide      (Narrow)
# We're back! The return value is from Wide

原本的调用来到 Middle 候选者,它用 Narrow 类型对象 callwithWide 候选者中。

如今,大家来勾兑一下, 用 42 而不是 Narrow 来调用。大家实在有三个 NotPrime 候选者。 42 和原本的 Middle 都能够适应那几个候选者。并且比原先的 Middle 候选者越来越宽, 并且它还地处调解链的上游。那可能会出错!

class Wide             { }
class Middle is Wide   { }
class Narrow is Middle { }

subset    Prime where     .?is-prime;
subset NotPrime where not .?is-prime;

multi foo (Narrow   $v) { say 'Narrow    ', $v; 'from Narrow'   }
multi foo (Middle   $v) {
    say 'Middle    ', $v;

    my $result = callwith 42;
    say "We're back! The return value is $result";

    'from Middle'
}
multi foo (Wide     $v) { say 'Wide      ', $v; 'from Wide'     }
multi foo (Prime    $v) { say 'Prime     ', $v; 'from Prime'    }
multi foo (NotPrime $v) { say 'Non-Prime ', $v; 'from NotPrime' }

foo Middle;

# OUTPUT:
# Middle    (Middle)
# Type check failed in binding to $v; expected Wide but got Int (42)
#   in sub foo at z2.p6 line 15
#   in sub foo at z2.p6 line 11
#   in block <unit> at z2.p6 line 19

哦,对,那个!我们给 callwith 的新参数不会影响调整, 所以尽管有二个候选人能够在调用链中尤为地拍卖大家的新参数, 但不是下二个候选人能够处理原始的 args, 这是 callwith 所调用的。结果是抛出十分, 由于大家的新参数绑定给下二个调用者时战败了。

Next one in line, please

笔者们来写一个类!叁个能干活的类!

role Things {
    multi method do-it($place) {
        say "I am {<eating sleeping coding weeping>.pick} at $place"
    }
}

class Doer does Things {}

Doer.do-it: 'home' # 输出: I am coding at home

大家碰不到role,因为它是外人为大家而做的,保持它们本来的本色吧。可是,大家目的在于大家的 class 能做更加多的作业!对于一些$place,大家期望它告诉大家有的更有血有肉的事物。别的,如若这些地点是 my new place,我们想精通哪些地点是新的。以下是代码:

role Things {
    multi method do-it($place) {
        say "I am {<eating sleeping coding weeping>.pick} at $place"
    }
}

class Doer does Things {
    multi method do-it($place where .contains: 'home') {
        nextsame if $place.contains: 'large';
        nextwith "home with $<color> roof"
          if $place ~~ /$<color>=[red|green|blue]/;

        samewith method 'my new place';
    }

    multi method do-it('my new place') {
        nextwith 'red home'
    }
}

Doer.do-it: 'the bus';       # OUTPUT: I am eating at the bus
Doer.do-it: 'home';          # OUTPUT: I am sleeping at red home
Doer.do-it: 'large home';    # OUTPUT: I am sleeping at large home
Doer.do-it: 'red home';      # OUTPUT: I am eating at home with red roof
Doer.do-it: 'some new home'; # OUTPUT: I am eating at red home
Doer.do-it: 'my new place';  # OUTPUT: I am coding at red home

多了一点额外的代码,而且未有对提供该措施的 role 进行单个改造,大家增多了一大堆新效率。大家来拜候大家利用的八个新的调节改变例程。

nextsamenextwith 函数与它们的 callsamecallwith 对应函数特别相似,除了它们不回来被调用的职位,它们的重回值将被作为当前例程的重返值。所以选拔 nextsame 就好像使用 return callsame,可是选取相当少的键入,况兼编写翻译器可以举行越多的优化。

咱俩增加到类中的第一个 multi 方法被调节到 $place .contains 单词 home 的岗位。在点子的大旨中,假如 $place 也暗含单词 large,大家运用 nextsame,即接纳与当前艺术一样的参数调用下一个金童玉女的候选人。那是此处的主要性。我们不能全体再一次调用大家的措施,因为它将跻身Infiniti循环重复分派给和睦。但是,由于 nextsame 在同二个调治链中使用下叁个候选人,所以未有循环发生,大家刚刚获得 role Things 中的候选人者。

往下读代码中,nextwith 也亲临。当 $place 提到三种颜色之不常,大家应用它。类似于 nextsame,它去下一个候选人,除了我们给它一个新的参数使用之外。

谈到底,大家过来 samewith。与原先使用的例程不一样,那么些东西从头最初重新起始调治,所以它基本上就如再次调用该方法同样,除了您不要知道或选取它的实际上名称。大家用一组新的参数来调用 samewith,从输出中我们能够看看新的调治路线通过大家增添到大家的类中的第二个multi 路线,并非持续从 role 的 multi,就如大家的 next____ 版本所做的这样。

固然 multi-dispatch 的核心很令人瞩目何况它还会有一对表达文档, 作者后天想讲的是 7 个特别的子例程, 让您可以看到行走在 dispatch 迷宫中。它们是 nextwith, nextsame, samewith, callwith, callsame, nextcalleelastcall.

设立实验室

Multies 从最窄到最广的候选人实行排序,并且当七个 multi 被调用时,绑定器尝试找到贰个相配并调用第二个非常的候选人。 有的时候,您大概希望调用或简捷地活动到链中的下四个极度候选者,可选地使用差异的参数。 为了考察这么些操作的效果与利益,我们将利用以下设置:

class Wide             { }
class Middle is Wide   { }
class Narrow is Middle { }

multi foo (Narrow $v) { say 'Narrow ', $v; 'from Narrow' }
multi foo (Middle $v) { say 'Middle ', $v; 'from Middle' }
multi foo (Wide   $v) { say 'Wide   ', $v; 'from Wide'   }

foo Narrow; # OUTPUT: Narrow (Narrow)
foo Middle; # OUTPUT: Middle (Middle)
foo Wide;   # OUTPUT: Wide   (Wide)

大家有四个类,每一个类都承继自前二个类,所以大家的 Narrow 类 能够适应 MiddleWide multi 候选者; Middle 也足以适应 Wide,但不能够适应 Narrow; 而 Narrow 既不适用于 Middle,也不适用于 Narrow。请牢记,Perl 6 中的全体类也都是 Any 类型,由此也适用于其余接受 Any 的候选人。

对于我们的 Callables,大家在 foo 子例程上利用多少个 multi 候选者:每一个类多个。在类的主心骨中,大家打字与印刷什么我们所调用的 multi 的等级次序,乃至作为参数字传送递的值。对于它们的再次回到值,大家只使用二个字符串来告诉大家重返值来自哪个 multi;大家稍后会动用那些。

谈起底,我们使用多个品类的指标与大家的自定义类进行一回调用。从输出来看,大家能够观看多少个候选人中的每三个候选人都按预期被调用了。

这一切都是清淡而世俗的。然则,大家得以调味!在此些例程的里边,我们能够随即调用 nextsamesamewithcallwithcallame 来调用具有同样或分裂参数的另一个候选人。但第一,大家来弄掌握它们都做如何?

Have you tried to call them with...

正如大家所知, __with 变体允许大家应用分化的参数。笔者会动用和事先的例证同样的代码, 差距便是现行反革命笔者会实践 callwith, 并使用 Narrow 类型对象作为新的参数:

class Wide             {}
class Middle is Wide   {}
class Narrow is Middle {}
multi foo(Narrow $v) { say 'Narrow', $v; 'from Narrow' }
multi foo(Middle $v) {
    say 'Middle', $v;

    my $result = callwith Narrow;
    say "We're back! The return value is $result";

    'from Middle'
}
multi foo(Wide $v) { say 'Wide ', $v; 'from Wide' }

foo Middle;

# OUTPUT:
# Middle (Middle)
# Wide   (Narrow)
# We're back! The return value is from Wide

出口的第一片段很领悟: 大家还是采取 Middle 调用 foo, 而且先击中 Middle 候选者。但是, 下一行输出有一点好奇。我们在 callwith 中使用了 Narrow 参数, 所以究竟 Wide 候选者是怎么获得调用的实际不是调用 Narrow 候选者呢?

原因是 call____next____ 例程使用与原本调用同样的调节链。由于 Narrow 候选者比 Middle 候选者更加窄, 所以被拒绝, 在前段时间的链条中不会被思虑。下叁个 callwith 将会调用的候选人将是下二个匹配 Middle 的候选人 -- 并不是笔误:Middle 是我们用来发起调治的参数, 因而下四个候选人将是仍是可以够承受该原始调用的参数的候选人。一旦发觉下三个候选人,传递给 callwith 的新参数就能够绑定到它身上, 这是您的办事, 以确认保证它们能够。

让我们在实战中看一个更目迷五色的例子。

Perl 6 的三个很好的风味是 multi-dispatch, 即多重分派。它同意你在函数, 方法或Grammar token 中央银行使一样的名字并让它们所拍卖的多少的品类来调整实行哪一个。上面是三个 factorial postfix 操作符, 用两个 multies 来实现:

It's all called the same...

笔者们品尝的第三个例程是 callsame。它使用和目前候选者同样的参数调用下一个万分的候选人并赶回该候选者的再次来到值。

让我们来修改下我们的 Middle 候选者以调用 callsame 然后打字与印刷出它的重返值:

calss Wide             {}
calss Middle is Wide   {}
class Narrow is Middle {}

multi foo(Narrow $v) { say 'Narrow', $v, 'from Narrow' }
multi foo(Middle $v) {
    say 'Middle', $v;

    my $result = callsame;
    say "We're back! The Return value is $result";

    'from Middle'
}

multi foo(Wide $v) { say 'Wide ', $v; 'from Wide' }

foo Middle;

# OUTPUT:
# Middle (Middle)
# Wide   (Middle)
# We're back! The return value is from Wide

未来得以看见大家的单个 foo 调用导致了三遍调用。第三遍到了 Middle, 因为它是大家给 foo 调用的档期的顺序对象。第叁次到了 Wide, 因为它是下三个能接收 Middle 类型的候选人; 在输出中大家看来 Wide 被调用时还是选择了我们原先的 Middle 类型对象。最终, 大家回去了大家的 Middle 候选者中, 并把 Wide 候选者的重临值设置给 $result 变量。

前段时间停止特别清晰, 让咱们探求修改下参数!

Wrapping It Up

为了整理那篇作品,大家将旁观另叁个世界,大家学到的例程能够派上用场:包装东西!以下是代码:

use soft;

sub meower (ッ, |c) {
    nextwith " 
		

本文由彩世界平台注册网站发布于历史资讯,转载请注明出处:来自国际民俗摄影“人类贡献奖”年赛组委会的

关键词: 人类贡献

上一篇:大赛 2018“山下湖”珍珠首饰创新意识设计大赛,

下一篇:没有了