【问题标题】:declaring global perl subroutines or global aliases声明全局 perl 子例程或全局别名
【发布时间】:2015-05-25 21:32:56
【问题描述】:

我的问题是,希望很简单。

在 Perl 中,如何创建一个全局范围的子例程,此后所有对象都可以访问?

sub throw
{
    die(shift);
}

似乎在全局范围内工作,但之后无法访问包。我想避免在我的应用程序堆栈中的每个对象中做某种声明。

侧面解​​决方案:如何为像 die 这样的全局关键字创建别名?

请注意:我真的不在乎这样做是否被认为是最佳做法。尽管它们在 Perl 中执行相同的功能,但 die 不是 throw,throw 不是 die。以下语法不遵循我试图遵循的 OOP 原则:

die new Exception($message);

尽管逻辑上相似,但出于抛出异常的目的,我更喜欢以下语法:

throw new Exception($message);

非常感谢 stackoverflow 社区!

【问题讨论】:

  • 请不要写new Classname。在 Perl 中,new 只是方法的名称,而不是关键字,它会混淆解释器。相反,请使用Exception->new($message)

标签: perl oop object global


【解决方案1】:

您可以将throw 添加到UNIVERSAL 包中(这不是一个好的做法)。

请注意,您的 throw 会忽略该消息并仅显示类名。

#!/usr/bin/perl
use warnings;
use strict;

{   package UNIVERSAL;

    sub throw { die shift }
}

{   package MyClass;

    sub new { bless {}, shift }
}

my $c = 'MyClass'->new;
$c->throw('Ouch!');

Try::Tiny

【讨论】:

  • 非常有趣!我喜欢这个主意!它肯定会集中它。我认为没有办法以允许我偶然使用语法“throw new someObj()”的方式做到这一点?顺便说一句,我之前一直在寻找如何做到这一点。 Perldocs 有时有点模糊。
  • 另一个说明,我想我会在上面添加它。我的意图是抛出对祝福异常对象的引用。希望这样做我可以在其中存储各种有用的信息,例如堆栈跟踪。再次感谢!
  • @steve: die 可以抛出异常对象。
  • 我知道。但是,我不喜欢上面提到的语法“die new Exception()”。
  • 正常的方法是创建一个模块MyThrow,从其他模块/脚本导出throwuse
【解决方案2】:

像这样的范式怎么样,可以同时解决你的两个问题?

package Exception;

sub throw {
  my $message = shift;
  die Exception->new($message);
}

sub new {
  # whatever
}

...

然后在任何包中你都可以这样使用它:

package SomeClass;

sub do_something {
  ...
  if ($error) {
    Exception->throw($message);
  }
}

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多