【问题标题】:How should I define 'static' subroutines in Perl?我应该如何在 Perl 中定义“静态”子例程?
【发布时间】:2011-04-20 05:33:10
【问题描述】:

我以前在 Java 中工作,所以这个问题可能是一个面向 Java 的 Perl 问题......无论如何,我已经使用 Moose 创建了一个 Person 包。

现在,我想添加一些“静态”子程序,即它们不引用特定的Person,但仍与Person 包密切相关。例如,sub sort_persons 获取 Person 对象的数组。

在 Java 中,我会简单地声明像 static 这样的函数。但是在 Perl 中......常见的方法是什么?

p.s.我认为我所指的 Perlish 术语是“类方法”

【问题讨论】:

  • @FM 这正是我的想法。请参阅我对 eugene y 的评论 :)

标签: function perl oop packages static-methods


【解决方案1】:

Perl 中没有静态方法。适用于整个类的方法通常称为类方法。它们与 实例方法 的区别仅在于它们的第一个参数的类型(它是包名称,而不是对象)。构造方法,如大多数 Perl 类中的 new(),是类方法的常见示例。

如果您希望将特定方法作为类方法调用,请执行以下操作:

sub class_method {
    my ($class, @args) = @_;
    die "class method invoked on object" if ref $class;
    # your code        
} 

【讨论】:

  • +1 我只是自己“发现”了它 :) 我想最常见的例子是 new(),我从来没有想过它是“静态”的,但它显然是。
  • 除非有某些原因导致在对象上调用类方法不好,否则我会跳过检查ref $self
  • 为了帮助区分类方法和对象方法,我喜欢使用$class 作为保存调用者的变量。所以sub class_method { my ($class, @params) = @_; # blah }
  • @cjm 跳过ref 检查,这意味着您最终可能会得到$class 中的参数,因此仍需要检查以将它们分开。
  • @Deanna,我指的是把它称为$object->class_method(@args) 而不是Class->class_method(@args)。这似乎是ref 试图阻止的事情,而且通常是矫枉过正。在$class 中获取第一个参数的唯一方法是将其作为子例程(class_method(@args))调用,ref 检查不会阻止这种情况,除非第一个参数通常是引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多