ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ハンドル オブジェクト

ハンドル オブジェクトとは

特定の種類の MATLAB® オブジェクトは "ハンドル" です。変数がハンドルを保持する場合、実際にはオブジェクトへの参照を保持します。

ハンドル オブジェクトを使用すると、複数の変数で同じ情報を参照できるようになります。ハンドル オブジェクトの動作は、ハンドル オブジェクトをコピーしたときや関数に渡したときに何が行われるかに影響します。

ハンドルのコピー

ハンドル オブジェクト変数のコピーはすべて、元となる同じオブジェクトを参照します。これはつまり、h がハンドル オブジェクトを表す場合、

h2 = h;

h と同じオブジェクトを参照する別の変数 h2 を作成するということです。

たとえば、MATLAB の関数 audioplayer は、特定の音声セグメントを再生するための音源データを含むハンドル オブジェクトを作成します。関数 audioplayer が返す変数はオーディオ データを表し、これを使用するとオブジェクト関数にアクセスしてオーディオを再生できます。

MATLAB ソフトウェアには、読み込んで audioplayer オブジェクトの作成に使用できるオーディオ データが用意されています。以下のサンプルはオーディオ データを読み込み、オーディオ プレーヤーを作成してオーディオを再生します。

load gong Fs y
gongSound = audioplayer(y,Fs);
play(gongSound)

gongSound オブジェクト ハンドルを別の変数 (gongSound2) にコピーするとします。

gongSound2 = gongSound;

変数 gongSoundgongSound2 は同じハンドルのコピーなので、同じ音源を参照します。いずれかの変数を使用して audioplayer 情報にアクセスします。

たとえば、銅鑼 (gong) 音源のサンプルレートを設定するには、SampleRate プロパティに新しい値を割り当てます。はじめに現在のサンプルレートを取得し、次に新しいサンプルレートを設定します。

sr = gongSound.SampleRate

sr =

        8192
gongSound.SampleRate = sr*2;

gongSound2 を使用して同じ音源にアクセスできます。

gongSound2.SampleRate

ans =

        16384

新しいサンプルレートで銅鑼の音を再生します。

play(gongSound2)

関数でのハンドル オブジェクトの変更

引数を関数に渡すと、その関数によって、関数の呼び出し元のワークスペースにある変数が、関数のワークスペースにあるパラメーター変数にコピーされます。

通常の (ハンドル以外の) 変数を関数に渡す場合、元の変数は影響を受けません。たとえば、myFunc はローカル変数 var を変更しますが、関数が終了するとローカル変数 var は存在しなくなります。

function myFunc(var)
   var = var + 1;
end

変数を定義し、myfunc に渡します。

x = 12;
myFunc(x)

myFunc(x) を実行しても、x の値は変化しません。

x

x =

        12

関数 myFunc は変更後の値を返すことができ、この値は同じ変数名 (x) または別の変数に割り当てることができます。

function out = myFunc(var)
   out = var + 1;
end

myfunc で値を変更します。

x = 12;
x = myFunc(x)
x

ans =

        13

引数がハンドル変数の場合、関数はハンドルのみをコピーし、ハンドルによって特定されるオブジェクトはコピーしません。両方のハンドル (元のハンドルとローカル コピー) は同じオブジェクトを参照します。

関数によりオブジェクト ハンドルの参照するデータが変更された場合、その変更内容は、呼び出し元のワークスペースにあるハンドル変数からアクセス可能であり、変更後のオブジェクトを返す必要はありません。

たとえば、関数 modifySampleRateaudioplayer のサンプルレートを変更します。

function modifySampleRate(audioObj,sr)
   audioObj.SampleRate = sr;
end

audioplayer オブジェクトを作成し、関数 modifySampleRate に渡します。

load gong Fs y
gongSound = audioplayer(y,Fs);
gongSound.SampleRate

ans =

       8192

modifySampleRate(gongSound,16384)
gongSound.SampleRate

ans =

       16384

関数 modifySampleRate は変更後の gongSound オブジェクトを返す必要はありません。これは、audioplayer オブジェクトがハンドル オブジェクトだからです。

オブジェクトがハンドルかどうかを調べる方法

ハンドル オブジェクトは handle クラスのメンバーです。このため、関数 isa を使用して、いつでもオブジェクトをハンドルとして識別できます。関数 isa はハンドル変数のテストで論理値 true (1) を返します。

load gong Fs y00
gongSound = audioplayer(y,Fs);
isa(gongSound,'handle')

ans =

     1

変数が有効なハンドル オブジェクトであるかどうかを判定するには、isaisvalid を使用します。

if isa(gongSound,'handle') && isvalid(gongSound)
   ...
end

削除されたハンドル オブジェクト

ハンドル オブジェクトが削除されていても、そのオブジェクトを参照していたハンドル変数がまだ存在していることがあります。参照先のオブジェクトはもう存在しないため、これらの変数は無効となります。オブジェクトに対して delete を呼び出すとそのオブジェクトが削除されますが、ハンドル変数は消去されません。

たとえば、audioplayer オブジェクトを作成するとします。

load gong Fs y
gongSound = audioplayer(y,Fs);

出力引数 gongSound はハンドル変数です。delete を呼び出すと、オブジェクトと、そこに含まれる音源情報が削除されます。

delete(gongSound)

しかし、ハンドル変数は存在したままです。

gongSound

gongSound = 

  handle to deleted audioplayer

whos コマンドは、gongSoundaudioplayer オブジェクトとして表示します。

whos
  Name               Size             Bytes  Class          Attributes

  Fs                 1x1                  8  double                   
  gongSound          1x1                104  audioplayer              
  y              42028x1             336224  double      

ハンドル gongSound は有効なオブジェクトを参照していません。

isvalid(gongSound)

ans =

     0

無効なハンドル変数を指定して関数を呼び出すことはできません。

play(gongSound)
Invalid or deleted object.

無効なハンドル変数のプロパティにアクセスすることはできません。

gongSound.SampleRate
Invalid or deleted object.

変数 gongSound を削除するには、clear を使用します。

clear gongSound
whos
  Name          Size             Bytes  Class     Attributes

  Fs            1x1                  8  double              
  y         42028x1             336224  double   
この情報は役に立ちましたか?