2014-03-26 57 views
0

所以我有一個帶有變量(x,y)的類AClass和一個函數,它應該將兩個對象作爲同一類的參數,計算它們的x和y,並且返回具有計算值的類的新實例。perl:從對象的函數中獲取一個值

package AClass; 

sub new { 
    my $class = shift; 
    my $x = shift; 
    my $y = shift; 
    my $self = { 
     x => $x, 
     y => $y 
    }; 
    return bless($self, $class);  
} 

sub getX { 
    my $self = shift; 
    return $self->{'x'}; 
} 

sub getY { 
    my $self = shift; 
    return $self->{'y'}; 
} 

sub addition { 
    my ($c1, $c2) = @_; 

    return new AClass(
     $c1->getX() + $c1->getX(), 
     $c1->getY() + $c2->getY() 
    ); 
} 


my $a1 = AClass->new(6, 4); 
my $a2 = AClass->new(4, 3); 

my $val = AClass::addition(\$v1, \$v2); 
say $val.getX(); 

我收到錯誤「Can not call method」getX「on unblessed reference」。我想這個問題還有另外一個功能,當我試圖訪問不是實數的對象的值時,或者?

+0

閱讀第一個答案[這裏](http://stackoverflow.com/questions/22665135/why-object -is-返回隨機值,在-perl的)。 –

+0

請將你的'新的AClass(...)'寫成'AClass-> new(...)'。如果你習慣於這樣寫,你會在將來的某個時刻爲自己節省很多痛苦。 –

回答

5

有一些問題在這裏。

  • 您正在使用$v1$v2時,想必你的意思是$a1$a2

  • 你是路過的,而不是自己

  • addition方法添加的對象引用這些對象, X值$c1本身,而不是X$c2

  • 您正在使用的字符串連接運算符.,而不是間接運算符->

  • 最好是使用小寫字母詞彙標識符。資本通常被保留,全局像包名

您必須總是use strictuse warnings在程序的頂部。在這種情況下,您將會收到有關$v1$v2尚未聲明的事實。

這是你的代碼的版本工作正常

use strict; 
use warnings; 

package AClass; 

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

sub get_x { 
    my $self = shift; 
    $self->{x}; 
} 

sub get_y { 
    my $self = shift; 
    $self->{y}; 
} 

sub addition { 
    my ($c1, $c2) = @_; 
    AClass->new(
     $c1->get_x + $c2->get_x, 
     $c1->get_y + $c2->get_y 
); 
} 

package main; 

use feature 'say'; 

my $a1 = AClass->new(6, 4); 
my $a2 = AClass->new(4, 3); 

my $val = AClass::addition($a1, $a2); 
say $val->get_x; 

輸出

10 
+0

@ikegami:也許吧。但我認爲Perl對象是一個有福的參考,而不是底層的數據項。在任何情況下,我都找不到重寫它的方法,以至於討論*引用引用*並不會更令人困惑! – Borodin

3

您使用$v1而不是$a1。始終使用use strict; use warnings;

此外,您無緣無故參考。

my $val = AClass::addition($a1, $a2); 

下也將工作(雖然add)將是一個更好的詞:

my $val = $a1->addition($a2);