كيف يمكنني الاتصال الطرق على ربط متغير ؟

StackOverflow https://stackoverflow.com/questions/524308

  •  22-08-2019
  •  | 
  •  

سؤال

لقد بدأت للتو لمعرفة المزيد عن التعادل.لدي صف يدعى الرابط الذي أود أن تفعل الشيء التالية:

  • إذا المنال ، عودة الرابط عنوان
  • إذا كان يتم تخزين, تخزين عنوان جديد
  • تكون قادرة على استدعاء الأساليب على ذلك

حتى الآن, رمز :


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;

ورمز أنا باستخدام للتحقق من وظائف هي:


use Link;

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

عندما ركض البرنامج النصي سيتم إنهاء مع رسالة الخطأ التالية:لا يمكن استدعاء الأسلوب "print_method" دون طرد أو مرجع كائن في tietest.pl الخط 4..

إذا فهمت رسالتها بشكل صحيح ، $var->print_method حل لبعض السلسلة التي تقوم عليها الطريقة print_method ويسمى.كيف يمكنني الاستفادة من التعادل, ولكن أيضا استخدام متغير كائن ؟

تحرير:بعد تجريب قليلا,لقد وجدت أن لو عدت $النفس على جلب سأتصل الطرق , ومع ذلك , جلب لن يعود العنوان .

تحرير 2:perl الرهبان توفيره لي الحل : تعادل .تعادل سيعود إشارة إلى متغير الكائن .

من خلال الجمع بين وتعادل مع أساليب لا يمكن أن تنجز كل ما أردت .

هل كانت مفيدة؟

المحلول

التعادل هو أداة خاطئة عن هذا العمل.يمكنك استخدام الروابط عندما تريد نفس واجهة عادية أنواع البيانات ولكن ترغب في تخصيص كيفية عمليات القيام بعملهم.منذ كنت ترغب في الوصول إلى متجر سلسلة مثل العددية بالفعل التعادل لا تفعل أي شيء بالنسبة لك.

يبدو أنك تريد URI وحدة أو مجموعة فرعية من ذلك ، وربما بعض الحمولة الزائدة.

إذا كنت حقا بحاجة للقيام بذلك تحتاج إلى استخدام حق متغير.على التعادل السنانير المتغير يمكنك تحديد الفصل تحديد, لكنه لا يزال العادي العددية (وليس المرجع).لديك لاستخدام الكائن يعود إذا كنت تريد أن أساليب الدعوة:

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

يمكنك أيضا الحصول على سر الكائن إذا كان لديك فقط وتعادل العددية:

my $secret_object = tied $normal_scalar;

لدي فصل كامل على التعادل في اتقان 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 هو على الأرجح أفضل رهان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top