Parameters.
基本的な値の渡し方です。
Atai(val)
Public {
Write val
}
このプログラムをtest.macという名前で保存したとすると、プログラムは次のように動作します。
USER> Do Atai^test(100)
100
Atai関数に引数100を渡し、実行しました。
Atai関数は渡された引数を変数valに格納し、プログラム中のWrite valの命令で、その内容を書きだします。
この結果、変数valに入っていた100が表示されます。
引数が複数必要な場合は、その数だけ受け取る引数をコンマ区切りで増やしていきます。以下は引数を3つ持つメソッドの例です。
Atai3ko(val1, val2, val3)
Public {
Write val1,!
Write val2,!
Write val3,!
}
渡される変数が少ない場合 - デフォルト値の設定
先ほどの
Atai3ko関数は引数を3つ受け取りました。このAtai3ko関数に、2つしかパラメータを渡さなかったらどうなるのでしょうか?
USER> Do Atai3ko^test(100,200)
100
200
Write
val3
^
<UNDEFINED>Atai3ko+1^test *val
このように、
プログラムは動作し始め、最初の2つのパラメータ (100と200) は出力していますが、3つ目の変数val3を出力しようとしたところで、<UNDEFINED>エラーが発生してプログラムが止まってしまいます。
この問題を防ぐには、引数にデフォルト値を用意しておく方法があります。
デフォルト値は次のように引数名の後ろに、イコールとデフォルト値 を書くことで使うことができます。
Atai3ko(val1 = 0, val2 =
0, val3 =
"ABC")
Public {
Write val1,!
Write val2,!
Write val3,!
}
上と同様に実行すると
USER> Do Atai3ko^test(100,200)
100
200
ABC
渡されなかった3つめの引数は、デフォルトのABCが出力されます。
渡される変数が多い場合 - 可変個数の引数
引数を3つ受け取るAtai3ko関数に、今度は
4つパラメータを渡したらどうなるのでしょうか?
USER> Do Atai3ko^test(100,200,300,400)
Atai3ko(val1 = 0, val2 = 0, val3 = "ABC") Public {
^
<PARAMETER>Atai3ko^test
<PARAMETER>エラーが発生してしまいます。
これを動作するようにするには、可変個数の引数を受け取れるようにします。可変個数の引数を受け取るには、変数名の後ろにピリオドを3つ置きます。
Takusan(Args...)
Public {
ZWrite Args
}
これに沢山の引数を渡すと、引数Argsに配列として渡されます。
USER> Do Takusan^test(1,2,3,4,5)
Args=5
Args(1)=1
Args(2)=2
Args(3)=3
Args(4)=4
Args(5)=5
沢山の値を渡す目的であれば、次の参照渡しを使用する方が良いでしょう。
参照渡しは、値渡しと比べると次のような違いがあります。
- メソッド内で引数を変更すると、メソッド呼び出し元でもその変更が反映される
- 配列などを渡すことができる
参照渡しは、メソッド
呼び出し側で変数名の前にピリオドを置きます。
Sansyou(X)
Public {
S X=X+100
}
このようなプログラムがある場合に、引数を値渡しした場合と、参照渡しした場合の動作を比べてみます。
USER>Set X=100
USER>Do Sansyou^test(X)
//値渡し
USER>Write X
100
USER>Do
Sansyou^test(.X) //参照渡し Xの前にピリオド
USER>Write X
200
値渡しでは実行後も変数 X の値は最初にセットした100のままですが、
参照渡しでは実行後の変数 X の値は、メソッド Sansyou 内で +100された200と変化しています。
Sansyou(X)
Public {
ZWrite
X
}
のようにプログラムを修正して、配列が渡されることを確認します。
USER>Set X=3, X(1)=10, X(2)=20, X(3)=30,
USER>Do
Sansyou^test(.X) //参照渡し Xの前にピリオド
X=3
X(1)=10
X(2)=20
X(3)=30
このようにメソッド中で配列の値を参照することができます。