質問
理解してい用の祝福"というキーワードPerlの内部クラスの新しい方法:
sub new {
my $self = bless { };
return $self;
}
それでは、そもそも"祝"ことをしているハッシュ。
解決
一般的に、bless
クラスとオブジェクトを関連付ける。
package MyClass;
my $object = { };
bless $object, "MyClass";
あなたは$object
のメソッドを呼び出すとき、さて、Perlはメソッドを検索するためにどのパッケージを知っています。
第二引数が省略されている場合は、、あなたの例のように、現在のパッケージ/クラスが使用されます。
次のように明確にするために、あなたの例では、書き込まれることがあります:
sub new {
my $class = shift;
my $self = { };
bless $self, $class;
}
編集:参照してください。 kixxするの良い<のhref = "https://stackoverflow.com/questions/392135 /何-正確-ん-のPerl-祝福-やる#392194" >もう少し詳しくために答えます。
他のヒント
bless
従業員の参考とパッケージです。
かの参考にできるハッシュ(通常の場合、配列は共通)には、スカラー(通常はこのことを示します inside-outオブジェクト)は、正規表現型はTYPEGLOBの書 オブジェクト指向Perl:総合ガイドの概念とプログラミング技術によるDamian Conway 有用例も参考にファイルやディレクトリハンドル(少なくとも普通の場合)。
の効果 bless
-ingできないということであるとき特殊な書式の恵まれた参考値です。
例えば、恵まれた参照が格納され $obj
(関連する bless
パッケージ"クラス") $obj->foo(@args)
通a型 foo
およびパスとして最初の引数の参照 $obj
その後、残りの引数(@args
).の型は定義するパッケージ"Class"としています。場合はありません型 foo
パッケージ"クラス"リストは他のパッケージされた形式の配列 @ISA
パッケージには"クラス")を検索し、最初の型 foo
が呼び出されます。
ショートバージョン:現在のパッケージの名前空間に取り付けたとして(そのパッケージは、そのクラスの実装を提供するように)それはそのハッシュマーキングの
。この機能は事業体によって参照されるREFであるオブジェクトのクラス名のパッケージ、または現在のパッケージの場合クラス名省略しております。利用の引数形式で祝福を推奨します。
例:
bless REF, CLASSNAME
bless REF
戻り値
この機能を返しますオブジェクトに対する参照に恵まれたCLASSNAME.
例:
以下の例のコードを示し、その基本的な使い方は、オブジェクト参照が作成される恵みへの参照このパッケージのクラス
#!/usr/bin/perl
package Person;
sub new
{
my $class = shift;
my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
# Print all the values just for clarification.
print "First Name is $self->{_firstName}\n";
print "Last Name is $self->{_lastName}\n";
print "SSN is $self->{_ssn}\n";
bless $self, $class;
return $self;
}
んで答えはここからもこちらかをクリックします。
Perlの祝福の機能連載を参考にすべての機能を内部に含まれています。
う必要があります。
の開始による表現の例でJavaScript:
(() => {
'use strict';
class Animal {
constructor(args) {
this.name = args.name;
this.sound = args.sound;
}
}
/* [WRONG] (global scope corruption)
* var animal = Animal({
* 'name': 'Jeff',
* 'sound': 'bark'
* });
* console.log(animal.name + ', ' + animal.sound); // seems good
* console.log(window.name); // my window's name is Jeff?
*/
// new is important!
var animal = new Animal(
'name': 'Jeff',
'sound': 'bark'
);
console.log(animal.name + ', ' + animal.sound); // still fine.
console.log(window.name); // undefined
})();
今でストリップのクラスを構築しくない:
(() => {
'use strict';
var Animal = function(args) {
this.name = args.name;
this.sound = args.sound;
return this; // implicit context hashmap
};
// the "new" causes the Animal to be unbound from global context, and
// rebinds it to an empty hash map before being constructed. The state is
// now bound to animal, not the global scope.
var animal = new Animal({
'name': 'Jeff',
'sound': 'bark'
});
console.log(animal.sound);
})();
のハッシュテーブルの順序付けの物件では意味がないって書物に特定の順にダイナミックに語2016年)を返すハッシュテーブル、そして、忘れの場合はの新しいキーワードに戻りま世界全体のコンテキスト(例えば窓ブラウザまたはグローバルにnodejs).
Perlは"本"にも"新しい"も"クラス"が可能であり、これまでのようにしている機能の動作も同様に。いないコンストラクタでも試作品ができる新しい動物です個々の物件です。
# self contained scope
(sub {
my $Animal = (sub {
return {
'name' => $_[0]{'name'},
'sound' => $_[0]{'sound'}
};
});
my $animal = $Animal->({
'name' => 'Jeff',
'sound' => 'bark'
});
print $animal->{sound};
})->();
今ませんでした。:何をしていくために、どのような動物の音声による自身の代わりに米印刷などの音声です。しているのは、欲しい機能performSoundることもに印刷物です。
そのための方法の一つである教員個々の動物のかと言われたのですが、これは音が出ます。これについては、独自の複製機能をperformSound.
# self contained scope
(sub {
my $Animal = (sub {
$name = $_[0]{'name'};
$sound = $_[0]{'sound'};
return {
'name' => $name,
'sound' => $sound,
'performSound' => sub {
print $sound . "\n";
}
};
});
my $animal = $Animal->({
'name' => 'Jeff',
'sound' => 'bark'
});
$animal->{'performSound'}();
})->();
こが悪いのでperformSound入れとして全く新しい関数オブジェクトの各時間に動物を構築する。10000動物とは10000performSounds.私たちも背筋が伸びる思いでした単機能performSoundで使用されるすべての動物に見えるが独自の音や版画です。
(() => {
'use strict';
/* a function that creates an Animal constructor which can be used to create animals */
var Animal = (() => {
/* function is important, as fat arrow does not have "this" and will not be bound to Animal. */
var InnerAnimal = function(args) {
this.name = args.name;
this.sound = args.sound;
};
/* defined once and all animals use the same single function call */
InnerAnimal.prototype.performSound = function() {
console.log(this.name);
};
return InnerAnimal;
})();
/* we're gonna create an animal with arguments in different order
because we want to be edgy. */
var animal = new Animal({
'sound': 'bark',
'name': 'Jeff'
});
animal.performSound(); // Jeff
})();
こちらは並列にPerlちょっと停止します。
JavaScriptの新しいオペレーターはオプションなので、この"内にオブジェクトのメソッドにcorruptsグローバル対象範囲:
(() => {
// 'use strict'; // uncommenting this prevents corruption and raises an error instead.
var Person = function() {
this.name = "Sam";
};
// var wrong = Person(); // oops! we have overwritten window.name or global.main.
// console.log(window.name); // my window's name is Sam?
var correct = new Person; // person's name is actually stored in the person now.
})();
私たちも背筋が伸びる思いでした一機能のための各動物によってこその動物を自分の音ではなくhardcodingです。
恵みのディスプレイ用パッケージの試作をサポートします。このように、オブジェクトは意識して"パッケージ"で"参照"としての機能をパッケージ"などをわかりやすく"を特定するインスタンスを作成したかのコンストラクタの"パッケージオブジェクト":
package Animal;
sub new {
my $packageRef = $_[0];
my $name = $_[1]->{'name'};
my $sound = $_[1]->{'sound'};
my $this = {
'name' => $name,
'sound' => $sound
};
bless($this, $packageRef);
return $this;
}
# all animals use the same performSound to look up their sound.
sub performSound {
my $this = shift;
my $sound = $this->{'sound'};
print $sound . "\n";
}
package main;
my $animal = Animal->new({
'name' => 'Cat',
'sound' => 'meow'
});
$animal->performSound();
概要/TL;DR:
Perlない"こ","クラス"も、"新規"をクリック。恵みへのオブジェクトのパッケージを与えるオブジェクトへの参照このパッケージには、ときに電話機能をパッケージには、その引数がオフセットを1スロットの最初の引数($_[0]または"shift)に相当するjavascriptの"。して、少しシミュレー JavaScriptの試作モデルです。
残念なことになるので(私の理解を創造する"新しい授業"でのランタイム時において、お客様のご要望に応じてそれぞれ"クラス"において、独自のパッケージはjavascriptをする必要がなくなり、より快適なパッケージで、"新しい"をキーワード上で匿名のhashmapをご利用いただけパッケージとして実行時に追加できます新しい機能の削除機能ができます。
あPerlの図書館を独自の方法を架橋するこの制限に表現力などのムー.
その混乱?:
でパッケージ。当社の勘りの結合をオブジェクトへのhashmapを含むその試作品です。このディスプレイをパッケージ"の実行時のようにJavaScriptできます。Perlなどの柔軟性を少なくとも内蔵していませんが、発明または取得するようになりますので、モジュールでは、お客様の実行時の表現力が妨げら.呼び出しでは"祝"なんでも便宜の供与も分からない。
を使って何をしたい:
のようなことが結合の試作地図を再帰的には、暗黙のうちに行きをプロトタイプによる明示的ます。
こちらはナイーブの試みです:の課題である"通話"知らない"かのように"なのであるとしても普遍的なperl機能"objectInvokeMethod(オブジェクト方式)"かどうかをチェックしますオブジェクトのメソッド、またはそのプロトタイプで、またはそのプロトタイプでに達するまでのとこない(継承関係を持ったプロトタイプ).Perlエレベーターホール<エバール>マジックだがだるいんでください。
とにかくこのアイディア
(sub {
my $Animal = (sub {
my $AnimalPrototype = {
'performSound' => sub {
return $_[0]->{'sound'};
}
};
my $call = sub {
my $this = $_[0];
my $proc = $_[1];
if (exists $this->{$proc}) {
return $this->{$proc}->();
} else {
return $this->{prototype}->{$proc}->($this, $proc);
}
};
return sub {
my $name = $_[0]->{name};
my $sound = $_[0]->{sound};
my $this = {
'this' => $this,
'name' => $name,
'sound' => $sound,
'prototype' => $AnimalPrototype,
'call' => $call
};
};
})->();
my $animal = $Animal->({
'name' => 'Jeff',
'sound'=> 'bark'
});
print($animal->{call}($animal, 'performSound'));
})->();
とにかくきれば誰かがこのポストです。
私は、開発オブジェクト指向Perlを導くために、この考えに続いています。
クラスを持つデータ構造の参照を関連付けるブレス。 Perlは(木の種類で)継承構造を作成する方法を考えると、組成物のためのオブジェクトを作成するには、オブジェクトモデルを利用することは容易である。
この会のために我々は常にオブジェクトとクラス行動の内部状態が分離されていることを心に持って開発し、オブジェクトと呼ばれます。そして、あなたはどのパッケージ/クラスの振る舞いを使用するすべてのデータの参照を許可する/祝福することができます。 パッケージには、オブジェクトの「感情的な」状態を把握することができますので。
あなたはどんなバグオブジェクトがblessされたハッシュをするつもりであることを確信することができた場合たとえば、あなたが(ついに!)バグで不足しているコードを入力することもでき:: print_me方法:
package Bug;
sub print_me
{
my ($self) = @_;
print "ID: $self->{id}\n";
print "$self->{descr}\n";
print "(Note: problem is fatal)\n" if $self->{type} eq "fatal";
}
さて、print_me方法は、バグのクラスに恵まれています任意のハッシュへのリファレンスを経由して呼び出されたとき、$自己変数は、最初の引数として渡された後、print文は、さまざまなエントリにアクセスして参照を抽出し、祝福されたハッシュ。