1

私はperlに関する本を読んでいますが、これまでのところ、次のコードに遭遇するまでOOPの概念を理解しています:

sub new {
    my $invocant = shift;
    my $class   = ref($invocant) || $invocant;
    my $self = {
        color  => "bay",
        legs   => 4,
        owner  => undef,
        @_,                 # Override previous attributes
    };
    return bless $self, $class;
}
$ed       = Horse->new;                    # A 4-legged bay horse
$stallion = Horse->new(color => "black");  # A 4-legged black horse

そのコードで私が見ているのは、newサブルーチンで渡されたものはすべて、このコードでオブジェクト参照に変換されるパッケージ名と見なされるということです:

my $invocant = shift; #this one just get the name of the package which is the argument passed

return bless $self, $class;

  1. ハッシュの事前宣言 (空のハッシュではない) の使用は何ですか? @_また、リストの最後の部分で が提供されているのはなぜですか? 何のために?

次は、上記のコードに基づくこのステートメントです。

この Horse コンストラクターは、インスタンス メソッドとして使用される場合、その呼び出し元の既存の属性を無視します。インスタンス メソッドとして呼び出されるように設計された 2 番目のコンストラクタを作成できます。適切に設計されていれば、呼び出し元のオブジェクトの値を新しいオブジェクトのデフォルトとして使用できます。

その声明の90%は私には理解できません。

  1. インスタンスメソッドとは?またはオブジェクトメソッド?例を挙げていただけますか?

これがオブジェクトとインスタンスのメソッドであることは知っていmy $class = ref($invocant) || $invocant;ますが、それらの違いや使い方がわかりません。

上記の「2番目のコンストラクター」は次のとおりです。

$steed  = Horse->new(color => "dun");
$foal   = $steed->clone(owner => "EquuGen Guild, Ltd.");
sub clone {
    my $model = shift;
    my $self  = $model->new(%$model, @_);
    return $self;     # Previously blessed by ->new
}

繰り返しますが、それが何をするのかわかりません。だから誰でも私のためにこれを明確にすることができます.

4

6 に答える 6

3

インスタンスメソッドとは?またはオブジェクトメソッド?例を挙げていただけますか?

インスタンスメソッドとオブジェクトメソッドは同じものです。インスタンスは 1 つのオブジェクトを表す Java 用語ですが、Perl では代わりに「オブジェクト」を使用することがよくありますが、本やドキュメントによって異なります。

Perl では、パッケージ内のサブルーチンを呼び出す構文上の方法が 3 つあります。

  • 非 OO (サブルーチン) メソッド:

    mySub(@parameters)

    効果: サブルーチン内では、特別な配列変数@_に (まあ、エイリアスが付けられますが、簡単にしましょう) が含まれ、他には何も含ま@parametersれません。

  • OO オブジェクト (またはインスタンス) 呼び出し:

    $obj->mySub(@parameters);

    mySubさて、これはそれがパッケージ内のメソッドであり、その作成されたオブジェクトであると想定してい$objます。

    効果: サブルーチン内で、特別な配列変数@_には、 list の先頭にオブジェクト$objを追加したリストが含まれます@parameters

  • オブジェクト指向パッケージ (またはクラス、または静的と呼ばれることもあります) 呼び出し:

    MyClassName->mySub(@parameters);

    ここで、これはmySubMyClassName パッケージのメソッドであると想定しています。

    効果: サブルーチン内では、特殊な配列変数に、文字列 "MyClassName" (パッケージ名)を listの先頭に@_追加したリストが含まれます。@parameters

    この最後のものは、コンストラクターがどのように機能するかです。

    • を呼び出すHorse->new("legs"=>3);と、@_配列にはsub:内に3つの要素のリストが含まれます。new()"Horse", "legs" and "3"

    • コンストラクmy $invocant = shift;ター@_$invocant.

ガイドとして役立つように、perlobj のドキュメントを読む必要があります。

于 2013-06-18T07:42:29.580 に答える
3

行が何をしているのかはすでに説明されています。これ@_はもう少しわかりやすいバージョンです(答えではなく、議論に追加するだけです-コードのフォーマットが必要な場合を除いて、コメントとして投稿されます):

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

    my $self = {
        color  => "bay",
        legs   => 4,
        owner  => undef,
        %args,                 # Override previous attributes
    };
    return bless $self, $class;
} 
于 2013-06-18T08:42:44.170 に答える