簡體   English   中英

同一模塊內的 Perl 對象

[英]Perl object inside the same module

標題含糊不清,但我會解釋一下。

我有一個 Perl 腳本,它使用一個名為systemId的模塊

我在腳本中創建了一個對象

my $id = systemId->new({_dom => "dev"});

我打算實例化一個類似於上面的對象,但在 systemId.pm 內。

我該怎么做?

我真的不能在網上搜索它,因為我不知道從什么開始搜索。

這可以像在腳本中那樣完成。 與如何將包和main::放在同一個文件中類似,一旦定義了包文件中的類,就可以使用它。 查看代碼后的注釋。

文件播放.pm

package Play;    
use warnings;
use strict;

sub new {
    my $class = shift;
    my $self = { _data => shift || 'default' }; 
    bless $self, $class;
    print "New object created.\n";
    return $self;
}

sub data {
    my $self = shift;
    if (@_) { $self->{_data} = shift }
    return $self->{_data};
}

print "Inside the package. Create object.\n";
my $obj = Play->new();
my $data = $obj->data();
print "data: $data\n";
print "\n";

1;

腳本

use warnings;
use strict;
use Play;

print "In main\n";
my $obj = Play->new(25);
print "data: " . $obj->data() . "\n";

運行腳本時打印輸出

Inside the package. Create object.
New object created.
data: default

In main
New object created.
data: 25

一旦執行了bless調用, $self就是類Play的對象。 來自祝福

祝福 REF,CLASSNAME
祝福REF
這個函數告訴 REF 引用的對象它現在是 CLASSNAME 包中的一個對象。 如果省略 CLASSNAME,則使用當前包。 [...]

由於我們在包中,它可以用作對象和調用它的方法。 來自perlobj

一旦我們祝福了$self引用的哈希,我們就可以開始調用它的方法。

這是指使用$self hashref,它成為對象。

請注意,在創建對象時可能存在初始化問題,以及究竟要做什么以及如何重要的問題。


我忍不住問,你想用這個做什么?

就這么簡單:

my $id = systemId->new({_dom => "dev"});

您還可以使用...

my $id = __PACKAGE__->new({_dom => "dev"});

...但第一個更明顯。

可以在任何地方創建新的對象實例,包括包/類本身。

->new函數通常是:

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

該實例實際上是在類模塊本身中創建的(使用bless )。 Perl 中的->new沒有魔法,一些模塊也使用另一個名稱,請參閱DateTime->now ,它在內部執行->new(epoch => time)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM