gpt4 book ai didi

perl - 当有 `&` 原型(prototype)时,如何使用 coderefs 而不是文字 subs?

转载 作者:行者123 更新时间:2023-12-04 23:39:03 24 4
gpt4 key购买 nike

我正在尝试制作 Router::Resource工作
其中函数的参数不是文字匿名子,而是
之前定义的 coderefs。我这样做是为了减少代码重复。

这是大纲中的代码,以最小但有效的方式。这行得通。

# app.psgi
use 5.024;
use Router::Resource qw(resource router GET POST);
my $app = sub {
my ($env) = @_;
my $router = router {
resource '/' => sub {
GET { [200, [], ['get /']] };
};
resource '/blog/{year}/{month}' => sub {
GET { [200, [], ['get /blog']] };
POST { [200, [], ['post /blog']] };
};
};
$router->dispatch($env);
}
__END__
$ plackup &
$ http -b :5000
127.0.0.1 - - [17/Apr/2017:14:25:28 +0200] "GET / HTTP/1.1" 200 5 "-" "HTTPie/0.9.2"
get /
$ http -b :5000/blog/2017/4
127.0.0.1 - - [17/Apr/2017:14:26:15 +0200] "GET /blog/2017/4 HTTP/1.1" 200 9 "-" "HTTPie/0.9.2"
get /blog
$ http -b POST :5000/blog/2017/4
127.0.0.1 - - [17/Apr/2017:14:26:28 +0200] "POST /blog/2017/4 HTTP/1.1" 200 10 "-" "HTTPie/0.9.2"
post /blog
$ pkill -f plackup

在将内部 PSGI 代码从文字匿名更改为 coderef 之后,因此:
my $get_root = sub { [200, [], ['get /']] };

resource '/' => sub {
GET $get_root;
};

然后程序将不再编译:
$ perl -c app.psgi
Type of arg 1 to Router::Resource::GET must be block or sub {} (not private variable) at app.psgi line 8, near "$get_root;"

函数原型(prototype)为 GET(&) .当 &是第一个位置,它允许调用者使用缩写语法,有点像 sort { … } @listmap { … }而不是 sort sub { … }, @list等等,见 perlsub#Prototypes :

An & requires an anonymous subroutine, which, if passed as the first argument, does not require the sub keyword or a subsequent comma.



当有原型(prototype)时,如何使用 coderefs 而不是文字 subs?

最佳答案

选项:

  • 绕过原型(prototype)。
    &GET($get_root)
  • 提供 BLOCK按照错误消息的要求。
    GET { $get_root->(@_) }
  • 提供 sub { }按照错误消息的要求。
    GET(sub { $get_root->(@_) })
  • 使用以 \& 开头的内容. (无证)
    GET(\&$get_root)
  • 关于perl - 当有 `&` 原型(prototype)时,如何使用 coderefs 而不是文字 subs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43451911/

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