Как я могу назвать методы на связанной переменной?

Это распространенная путаница среди начинающих. При использовании гипотезы тактика apply работает следующим образом: если H1 : A -> B и H2 : A, apply H1 in H2 заменяет H2 на H2 : B. Таким образом, чтобы ваше доказательство было успешным, вы должны иметь обратное значение IHl : All ... l -> forallb func l = true в контексте или гипотезу H1 : forallb func l = true.

5
задан brian d foy 7 February 2009 в 21:33
поделиться

2 ответа

Связь является неправильным инструментом для этого задания. Вы используете связи, когда Вы хотите тот же интерфейс как нормальные типы данных, но хотите настроить, как операции делают свою работу. Так как Вы хотите получить доступ и сохранить строку точно так же, как скаляр уже делает, связь ничего не делает для Вас.

Похоже на желание модуля URI, или подкласса его и возможно некоторой перегрузки.

Если действительно необходимо сделать это, необходимо использовать правильную переменную. Связь поднимает трубку переменную, которую Вы указываете к классу, который Вы указываете, но это - все еще нормальный скаляр (и не ссылка). Необходимо использовать объект, который это возвращает, если Вы хотите назвать методы:

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

Можно также получить секретный объект, если у Вас только есть связанный скаляр:

my $secret_object = tied $normal_scalar;

У меня есть вся глава по, связывают Освоение Perl.

10
ответ дан 18 December 2019 в 08:31
поделиться

Я предлагаю делать нормальный объект Perl и затем перегрузить stringification. Вы теряете способность сохранить значение через присвоение, но сохранить способность вывести значение путем печати объекта. После того как Вы начинаете желать назвать методы непосредственно, объект, вероятно, что Вы хотите.

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;

Использование в качестве примера:

use Link;

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

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

Если Вы действительно, действительно хотите, чтобы присвоение работало также, можно объединить обычный объект с перегруженным stringification (Link, выше) с 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;

Использование в качестве примера:

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

Это все довольно отвратительно и длинный путь для движения только для получения сомнительной способности присвоить чему-то, что можно также обратиться к методам и также распечатать как есть. Стандартный объект URI с stringification является, вероятно, лучшей ставкой.

9
ответ дан 18 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: