1

こんにちは基本的にそれはperlでのオブジェクト指向プログラミングの問題です。2つのオブジェクトAとBが必要で、AにはタイプBのメンバー変数が含まれています。いくつかのテストを実行しましたが、機能しないようです。何か案が?

午後

package a;


sub new{
    my $self = {};
    my $b = shift;
    $self->{B} = $b;
    bless $self;
    return $self;
}

sub doa{
    my $self = shift;
    print "a\n";
    $self->{B}->dob;
}

1;

b.pm

package b;

sub new {
    my $self = {};
    bless $self;
    return $self;
}

sub dob{
    my $self = shift;
    print "b\n";
} 



1;

test.pl

use a;
use b;

my $b = b->new;
my $a = a->new($b);
$a->doa;

これを実行すると、次のように表示されます。

a
Can't locate object method "dob" via package "a" at a.pm line 16.
4

3 に答える 3

6

メソッドの最初のパラメーターを忘れていました。メソッドの最初のパラメーターは常に呼び出し元です。

sub new {
    my ($class, $b) = @_;
    my $self = {};
    $self->{B} = $b;
    return bless($self, $class);
}

普段は私がbless先だけど

sub new {
    my ($class, ...) = @_;
    my $self = bless({}, $class);
    $self->{attribute} = ...;
    return $self;
}

派生クラスのコンストラクターとの一貫性が向上するためです。

sub new {
    my ($class, ...) = @_;
    my $self = $class->SUPER::new(...);
    $self->{attribute} = ...;
    return $self;
}
于 2013-02-14T20:43:35.063 に答える
4

Mooseやその軽量版であるMooなどを使用して、Perl OO を簡単にしたい場合があります。また、(無料の) Modern Perl Bookで、よりモダンな Perl が提供する多くの新しくエキサイティングなことを学ぶことができます!

#!/usr/bin/env perl

use strict;
use warnings;

package ClassA;

use Moo;

has 'b' => (
  is => 'ro',
  isa => sub { shift->isa('ClassB') or die "Need a ClassB\n" },  # not necessary but handy
  required => 1,
);

sub doa {
    my $self = shift;
    print "a\n";
    $self->b->dob;
}

package ClassB;

use Moo;

sub dob {
  my $self = shift;
  print "b\n";
}

package main;

my $b = ClassB->new;
my $a = ClassA->new( b => $b );
$a->doa;

実際、あなたが望むものによっては、委譲のようなものが必要になるかもしれません:

#!/usr/bin/env perl

use strict;
use warnings;

package ClassA;

use Moo;

has 'b' => (
  is => 'ro',
  isa => sub { shift->isa('ClassB') or die "Need a ClassB\n" },  # not necessary but handy
  required => 1,
  handles => ['dob'],
);

sub doa {
    my $self = shift;
    print "a\n";
}

package ClassB;

use Moo;

sub dob {
  my $self = shift;
  print "b\n";
}

package main;

my $b = ClassB->new;
my $a = ClassA->new( b => $b );
$a->doa;
$a->dob;
于 2013-02-14T20:42:47.213 に答える
2

オブジェクトを適切に祝福していません。これを試して:

A:

sub new {                                                                                                                                                                                               
    my $class = shift;                                                                                                                                                                                 
    my $b = shift;                                                                                                                                                                                     
    return bless { B => $b }, $class;                                                                                                                                                                  
}  

B:

sub new {
    my $class = shift;
    return bless {}, $class; 
} 
于 2013-02-14T20:43:45.800 に答える