【问题标题】:Mojolicious: Can't call method "render" on an undefined valueMojolicious:不能在未定义的值上调用方法“渲染”
【发布时间】:2016-09-23 14:45:06
【问题描述】:

我收到此错误,无法理解为什么会发生这种情况。当我跳转到另一个子程序时会发生这种情况。也许我需要了解 Mojolicious 发生这种情况的原因。

这是我的程序的源代码:

#!/usr/bin/perl

use Mojolicious::Lite;

get '/' => sub { &start_home; };

app->start;

sub start_home {
  my $d = shift;
  my $something = $d->param('something');
  ### Do things with $something.... etc.. etc..
  &go_somewhere_else; ### Go somewhere else
}

sub go_somewhere_else {
 my $c = shift;
 $c->render(text => "Hello World!");
 ### End of program
}

我将一个值传递给渲染器并且有一个值 - 为什么它会说它是未定义的?我的理解是,只有当您跳转到子程序并尝试渲染输出时才会发生这种情况。

我的操作系统是 Windows,我使用的是 Strawberry Perl。

【问题讨论】:

    标签: perl mojolicious mojolicious-lite


    【解决方案1】:

    您需要将上下文对象$c/$d 传递给您的第二个函数。 未定义值是您在go_somewhere_else 中的$c,因为您在没有参数的情况下调用它。

    最初,要使其工作,请执行此操作。

    sub start_home {
      my $d = shift;
      my $something = $d->param('something');
    
      go_somewhere_else($d);
    }
    

    您现在将您命名为$d(这不是传统名称)的上下文传递给另一个函数,警告将消失。

    这是因为 &subname; 不带括号 () 的形式使 @_(这是函数的参数列表)在 go_somewhere_else 内部可用,但因为你 shifted $d 关闭,@987654335 @ 现在是空的,因此您在 go_somewhere_else 中的 $cundef

    或者,您也可以将shift 更改为@_ 的分配。但是请不要这样做

    sub start_home {
      my ( $d ) = @_;
      my $something = $d->param('something');
    
      &go_somewhere_else;
    }
    

    这里还有更多奇怪到几乎错的地方。

    get '/' => sub { &start_home; };
    

    你是curryingstart_home函数,但你实际上并没有添加另一个参数。我在上面解释了为什么这样做。但这不是很好。事实上,它令人困惑和复杂。

    相反,您应该为路线使用代码参考。

    get '/' => \&start_home;
    

    start_home 内部,您应该按照惯例调用您的上下文$c。您也不应该使用与符号& 来调用函数。这会以您绝对不希望的方式改变行为。

    sub start_home {
      my $c = shift;
      my $something = $c->param('something');
    
      # ...
      go_somewhere_else($c);
    }
    

    要了解有关函数调用如何在 Perl 中工作的更多信息,请参阅 perlsub

    【讨论】:

    • @Eugen 您的编辑不正确。第一个代码块的整个想法是 @_ 在函数中是空的,所以绝对没有必要传递它。我在下面的段落中解释了这一点。我回滚了你的编辑。
    • 在这种情况下,第一个和第二个示例的工作方式不同。如果start_home 获得两个或更多参数,第一个示例将全部丢弃它们,但第二个示例将通过它们。在第一个示例中通过@_ 明确显示示例之间的差异仅在第一个参数处。
    猜你喜欢
    • 2015-08-01
    • 2014-10-31
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多