1

我刚刚开始设计一个 Perl 类,而我之前对 OOP 的唯一经验是很久以前的 C++。

有几项数据我需要成为“类变量”——由所有实例共享。我希望它们在我第一次实例化一个对象之前被初始化,并且我希望发出的主程序use MyClass能够为该初始化过程提供一个参数。

这是一个具有类变量的类的工作示例:

package MyClass;
use strict;
use warnings;

# class variable ('our' for package visibility)                                                                 
#                                                                                                               
our $class_variable = 3;  # Would like to bind to a variable                                                    

sub new {
     my $class = shift;
     my $self = { };
     bless $self, $class;
     return $self;
}

sub method {
    my $self = shift;
    print "class_variable: $class_variable\n";
    ++$class_variable; # prove that other instances will see this change                                        
}

这是一个演示:

#!/usr/bin/perl                                                                                                 

use strict;
use warnings;
use MyClass;

my $foo = MyClass->new();
$foo->method(); # show the class variable, and increment it.

my $bar = MyClass->new();
$bar->method(); # this will show the incremented class variable.

主程序有没有办法为 $class_variable 指定一个值?该值将在主程序的编译时已知。

4

4 回答 4

6

您还可以通过使用my而不是声明变量来使变量“私有” our。在这种情况下,您必须提供一个类方法来初始化它:

my $class_variable = 3;

sub initialize_variable {
    my ($class, $value) = @_;
    die "Ivalid value $value.\n" unless $value =~ /^[0-9]+$/;
    $class_variable = $value;
}

然后在程序中:

'MyClass'->initialize_variable(42);
于 2013-05-20T18:42:47.450 回答
2
$MyClass::class_variable = "some value";
于 2013-05-20T18:21:49.713 回答
2

使用导入工具:

package MyClass;

my $class_variable;

sub import
{
  (undef, my $new_class_variable) = @_;

  if (defined $class_variable and
      defined $new_class_variable and
      $class_variable ne $new_class_variable)
  {
    warn '$MyClass::class_variable redefined';
  }

  $class_variable = $new_class_variable if defined $new_class_variable;
}

使用模块时传递值:

use MyClass qw(42);

它不完全是惯用的 Perl,但也不少见。函数中间的健全性检查应该给你一个提示,为什么它可能不是所有情况下的最佳方法。如果 MyClass 只应该是use来自顶级脚本的 d ,则可以强制执行该健全性检查:

caller eq 'main' or die 'MyClass can only be used from package main';
于 2013-05-21T02:15:37.680 回答
0

您还可以使用 Class 方法:

前任:

package myclass;

our $class_variable = 5;

sub myclass_method{

    my ($class, $new_class_variable_value) = @_;

    if( $class_variable != $new_class_variable_value )
    {
        ## set the new value of the class/package variable
        $class_variable = $new_class_variable_value;
    }
}

在您的脚本中,您可以通过以下方式调用它:

myclass::myclass_method('myclass', 7);
于 2013-12-13T18:12:22.587 回答