-1

次のようなことはできませんか

#! usr/bin/perl
use strict;
use warnings;
use Horse; #this is the package

my $test;

bless $test,Horse;

上記のコードは$testHorse パッケージへのオブジェクト参照としてインスタンス化されますか? それとも、Perl のオブジェクトは、blessインスタンス化されるのを待っている「既にステートメントを持っている」単なるパッケージですか?

また、オブジェクト変数、メソッド、または関数へのアクセスのサンプルを提供できますか? Perl では何と呼ばれていますか?

4

1 に答える 1

4

ビルトインは、参照にパッケージ名のblessタグを付けます。そのパッケージは、オブジェクトで呼び出されるメソッドを解決するために使用されます。したがって、明示的なパッケージがなくても、実行できます

my $obj = bless { x => 1}, 'Foo';

sub Foo::x {
  my $self = shift;
  return $self->{x};
}

print "1 == ", $obj->x, "\n";

に与えられたパッケージ名を引用する必要があることに注意してくださいbless

そうです、インポートされたクラスを含め、任意のクラスへの参照を bless できます。ただし、これはコンストラクターを実行せず、クラス/オブジェクト (クラス メソッドなど) と対話するメソッドのみを使用する必要があるオブジェクト指向の原則である「カプセル化」を破ることに注意してくださいnew


編集:完全修飾名

各グローバル変数には、パッケージ名と変数名で構成される完全修飾名があります。サブルーチンは、特別な種類の変数です。たとえば、次のようになります。

$Some::Package::var = 5;
sub Some::Package::give_var { return $Some::Package::var }

とほぼ同じものです

{
  package Some::Package; # package declaration opens a new namespace
  our $var = 5;
  sub give_var { return $var }
}

したがって、パッケージで名前がsub Foo::x {...}付けられたサブを宣言します。xFoo

于 2013-06-18T08:40:03.500 に答える