Есть ли в Perl указатели классов для доступа к переменным и функциям-членам? - PullRequest
2 голосов
/ 28 февраля 2020

Я хочу построить класс Node в Perl (используя ключевое слово «пакет»), но я не уверен, как создать указатель на переменную класса, как в C ++.

В C ++, у вас есть:

class Node
{
public:
    int key;
    Node* left;
    Node* right;

    Node(int _key)
    {
        key = _key;
        left = NULL;
        right = NULL;
    }
};

В Perl:

package Node;
sub Node
{
    my $class = shift;

    my $key;
    Node* left;        # Of course, this will not work
    Node* right;
}

Есть ли способ сделать указатель на переменную класса в Perl? Или, если это невозможно, какие-либо предложения по Perl модулям, которые могли бы делать то, что я хочу сделать?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020
package Node;

use strict;
use warnings qw( all );

use Carp qw( croak );

sub new  {
   my ($class, %args) = @_;

   croak("key is required") if !exists($args{key});

   my $self = bless({}, $class);

   $self->{ key   } = $args{ key   };
   $self->{ left  } = $args{ left  };
   $self->{ right } = $args{ right };

   return $self;
}

sub key   { my $self = shift; $self->{ key   } = shift if @_; $self->{ key   } }
sub left  { my $self = shift; $self->{ left  } = shift if @_; $self->{ left  } }
sub right { my $self = shift; $self->{ right } = shift if @_; $self->{ right } }

1;

или

package Node;

use strict;
use warnings qw( all );

use Moo;

use namespace::clean;

has key   => ( is => 'rw', required => 1 );
has left  => ( is => 'rw' );
has right => ( is => 'rw' );

1;

Использование:

my $node = Node->new(
   key   => $key,
   left  => $left,    # Optional. Defaults to undef.
   right => $right,   # Optional. Defaults to undef.
);
1 голос
/ 28 февраля 2020

На самом деле, если вы хотите использовать OOP в Perl, вы должны проверить существующие фреймворки, такие как Moose или сделать это самостоятельно, используя bless . Пример:

package Node;

sub new {
  my ($class, $key) = @_;
  bless { key => $key }, $class;
}

my $node = Node->new();

Позже вы можете добавить «указатели» к «объекту», добавив ссылки на узлы в ha sh внутри node.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...