Pregunta

Acabo de empezar a aprender acerca de empate.Tengo una clase llamada Enlace que me gustaría hacer lo siguiente:

  • si se recuperan, el regreso de la dirección de vínculo
  • si se almacena, de la tienda la nueva dirección
  • ser capaz de llamar a métodos en ella

Hasta ahora, mi código es :


package Link;

sub FETCH {
    my $this = shift;
    return $this->{"site"};
}

sub STORE {
    my ($self,$site) = @_;
    $self->{"site"}   = $site;
}

sub print_method {
    my $self = shift;
    print $self->{"site"};
}

sub TIESCALAR {
    my $class = shift;
    my $link  = shift;
    my $this  = {};
    bless($this,$class);
    $this->{"site"} = $link;
    return $this;
}

1;

Y el código que estoy usando para comprobar la funcionalidad es:


use Link;

tie my $var,"Link","http://somesite.com";
$var->print_method;

Cuando se corrió, la secuencia de comandos se terminará con el siguiente error:No se puede llamar al método "print_method" sin un paquete u objeto de referencia en tietest.pl línea 4..

Si entiendo su mensaje correctamente, $var->print_method se resuelve con una cadena en la cual el método print_method se llama.¿Cómo podría beneficiarse de la corbata, sino también el uso de la variable como un objeto?

EDITAR:después de experimentar un poco,me enteré de que si vuelvo a $auto en recuperar , me puede llamar a los métodos , sin embargo , fetch no devolver la dirección .

EDIT 2:el perl de los monjes suministrado mí, la solución : atado .atado devolverá una referencia a la VARIABLE de objeto .

Mediante la combinación de atado con mis métodos , que puedo lograr todo lo que yo quería .

¿Fue útil?

Solución

La corbata es la herramienta equivocada para este trabajo.Utilice los vínculos cuando se desea la misma interfaz normal de tipos de datos, pero desea personalizar la forma en que las operaciones de hacer su trabajo.Puesto que usted desea acceder y almacenar una cadena como un escalar ya lo hace, el empate no hacer nada por usted.

Parece que quieres el URI módulo, o de una subclase de ella, y tal vez algunos de sobrecarga.

Si usted realmente necesita para hacer esto, usted necesita para utilizar la variable de la derecha.El empate los ganchos de seguridad de la variable que se especifique para la clase que usted especifique, pero aún así es normal escalar (y no es una referencia).Usted tiene que utilizar el objeto que se devuelve si usted desea llamar a los métodos:

my $secret_object = tie my($normal_scalar), 'Tie::Class', @args;
$secret_object->print_method;

También puede obtener el objeto secreto si sólo tiene el atado escalares:

my $secret_object = tied $normal_scalar;

Tengo un capítulo entero en el lazo en Dominar Perl.

Otros consejos

sugiero hacer un objeto normal de Perl y luego sobrecarga stringification ing. Se pierde la capacidad para almacenar un valor a través de la asignación, pero conservan la capacidad de obtener el valor por imprimir el objeto. Una vez que empiece a querer llamar directamente métodos, un objeto es probablemente lo que quiere.

package Link;

use strict;
use Carp;

use overload
(
  '""'      => sub { shift->site },
   fallback => 1,
);

sub new 
{
  my $class = shift;

  my $self = bless {}, $class;

  if(@_)
  {
    if(@_ == 1)
    {
      $self->{'site'} = shift;
    }
    else { croak "$class->new() expects a single URL argument" }
  }

  return $self;
}

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

sub print_method
{
  my $self = shift;
  print $self->site, "\n";
}

1;

Ejemplo de uso:

use Link;

my $link = Link->new('http://somesite.com');

print $link, "\n";   # http://somesite.com
$link->print_method; # http://somesite.com

Si realmente, realmente quiere desempeñar un trabajo demasiado, puede combinar un objeto normal con stringification sobrecargada (Link, arriba) con tie:

package LinkTie;

use strict;
use Link;

sub FETCH
{
  my $this = shift;
  return $this->{'link'};
}

sub STORE
{
  my($self, $site) = @_;
  $self->{'link'}->site($site);
  return $site;
}

# XXX: You could generalize this delegation with Class::Delegation or similar
sub print_method
{
  my $self = shift;
  print $self->{'link'}->print_method;
}

sub TIESCALAR
{
  my $class = shift;
  my $self = bless {}, $class;
  $self->{'link'} = Link->new(@_);
  return $self;
}

1;

Ejemplo de uso:

tie my $link,'LinkTie','http://somesite.com';
print $link, "\n";   # http://somesite.com
$link->print_method; # http://somesite.com

$link = 'http://othersite.com';

print $link, "\n";   # http://othersite.com
$link->print_method; # http://othersite.com

Todo esto es bastante horrible y un largo camino por recorrer para conseguir la capacidad dudosa para asignar a algo que también se puede llamar a los métodos de imprimir y como está. Un objeto estándar URI con stringification es probablemente una mejor opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top