Files
krkr2doc/docs/tjs2doc/contents/function.html
2016-09-08 17:50:19 +09:00

252 lines
17 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<!-- generated by to_html.pl from function.xml -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>関数</title>
<meta name="author" content="W.Dee" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link href="browser.css" type="text/css" rel="stylesheet" title="吉里吉里関連リファレンス用標準スタイル" />
<link href="mailto:[email protected]" rev="Made" />
<link href="index.html" target="_top" rel="Start" title="トップページ" />
</head>
<body>
<h1><a id="id199" name="id199">関数</a>
</h1><div class="para"><div>
 TJS2 の関数は<a id="id200" name="id200" class="targanchor"><dfn>サブルーチン</dfn></a>とほぼ同義です。値を返すことのない場合も関数として扱います。<br />
 また、特にクラスやオブジェクトのメンバとなっている関数を「<a id="id201" name="id201" class="targanchor"><dfn>メソッド</dfn></a>」と呼ぶことがあります。<br />
</div></div>
<h1><a id="id202" name="id202">関数の書き方</a>
</h1><div class="para"><div>
 関数は、以下の書式で書くことができます。<br />
<br />
<code class="bq">&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;関数名&nbsp;(&nbsp;引数リスト&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;関数の内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
 まず、関数を定義するには、<a id="id203" name="id203" class="targanchor"><dfn>function</dfn></a> を書きます。そのあとに、関数の名前を書きます。ここに書いた名前で関数が使用可能になります。<br />
 関数の内容には、関数内で実行したいステートメントやブロックを記述することができます。<br />
<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;test(a)&nbsp;{&nbsp;System.inform(a);&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func(a,&nbsp;b,&nbsp;c,&nbsp;d)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a+b-c*d;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
関数に対して instanceof 演算子を &quot;Function&quot; を伴って使用した場合は真になります(上記の例で言うと、func instanceof &quot;Function&quot; は真)。<br />
</div></div>
<h1><a id="id204" name="id204">関数の呼び出し</a>
</h1><div class="para"><div>
 関数の呼び出しは <a id="id205" name="id205" class="targanchor"><dfn>( )</dfn></a> 演算子を使って、以下のように記述します。<br />
<code class="inlinecode">&nbsp;&nbsp;&nbsp;&nbsp;関数名( 引数 )<br />
</code>&nbsp;&nbsp;&nbsp;&nbsp;引数がない場合は、<code class="inlinecode">関数名( )</code> になります。引数には、式を指定し、複数ある場合はカンマで区切って指定します。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;func();<br />
&nbsp;&nbsp;&nbsp;&nbsp;func(1+2,&nbsp;1-2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;func(func2());<br />
</code>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;また、式を指定せずに、空にしておくと、そこの部分には void が指定されたと見なされます。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;func(,1);&nbsp;<span class="comment">//&nbsp;void,&nbsp;1&nbsp;が指定されたとみなされる</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;func(,);&nbsp;<span class="comment">//&nbsp;void,&nbsp;void&nbsp;が指定されたと見なされる</span><br />
</code>
<br />
</div></div>
<h1><a id="id206" name="id206">引数リスト</a>
</h1><div class="para"><div>
 引数リストには、渡された引数を受け取るための変数の名前を書きます。関数呼び出しの際に渡した引数のうち、前に書いたものから順番に、変数に引き渡されます。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;test(a,&nbsp;b,&nbsp;c)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;この時点で、&nbsp;a&nbsp;&nbsp;b&nbsp;&nbsp;c&nbsp;という変数が使用可能であり、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;引数として渡された&nbsp;3&nbsp;つの引数が代入されています。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;test(1,&nbsp;2,&nbsp;3)&nbsp;と呼び出した場合は、&nbsp;a&nbsp;&nbsp;1、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;b&nbsp;&nbsp;2,&nbsp;c&nbsp;&nbsp;3&nbsp;が入っています。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
 これらの引数はローカル変数であり、関数から実行が抜けるとアクセスできなくなります。<br />
<br />
 TJS2 では、関数呼び出しの際に与えられた引数が宣言の引数の数よりも少なかったり、多かったりしてもエラーにはなりません ( 例外的に、TJS2 で記述されたのではない関数 ( 実体が C++ などで記述された関数 ) はエラーにする場合があります )。与えられた引数が宣言より多い場合は多い分が無視され、少ない場合は、足りない変数には void が渡されます。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;test(a,&nbsp;b)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;もし&nbsp;test(1)&nbsp;として呼び出すと、a&nbsp;には&nbsp;1&nbsp;、b&nbsp;には&nbsp;void&nbsp;が入る。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;もし&nbsp;test(1,2,3)&nbsp;として呼び出すと、&nbsp;a&nbsp;には&nbsp;1、&nbsp;b&nbsp;には&nbsp;2&nbsp;が入り、3&nbsp;は無視される</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
 引数リストの個々の引数には、 = に続けてデフォルトの値 ( <a id="id207" name="id207" class="targanchor"><dfn>デフォルト引数</dfn></a> ) を指定することができます。これは、void が指定されたときや、与えられた引数が宣言の引数に満たない場合に、自動的に指定された値が使用されるというものです。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;test(a&nbsp;=&nbsp;-1,&nbsp;b&nbsp;=&nbsp;1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;もし・・・</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;test()&nbsp;として呼び出すと、&nbsp;a=-1,&nbsp;b=1</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;test(5)&nbsp;として呼び出すと、&nbsp;a=5,&nbsp;b=1</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;test(void,void)&nbsp;として呼び出すと、&nbsp;a=-1,&nbsp;b=1</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;test(,4)&nbsp;として呼び出すと、a=-1,&nbsp;b=4</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
 引数を受け取る必要のない関数は、引数リストを省略することができます。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;test<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;引数を受け取らない関数</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
</div></div>
<h1><a id="id208" name="id208">式中関数</a>
</h1><div class="para"><div>
 function キーワードを式内で使うと、名前のない関数、式中関数 ( <a id="id209" name="id209" class="targanchor"><dfn>匿名関数</dfn></a> ) を作成することができます。<br />
 この場合、関数の名前は省略します。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;func&nbsp;=&nbsp;function(i)&nbsp;{&nbsp;return&nbsp;i*5;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;func2&nbsp;=&nbsp;function&nbsp;{&nbsp;System.inform(&quot;hoge&quot;);&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;v&nbsp;=&nbsp;func();&nbsp;<span class="comment">//&nbsp;func&nbsp;呼び出し</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;func2();&nbsp;<span class="comment">//&nbsp;func2&nbsp;呼び出し</span><br />
</code>
<br />
</div></div>
<h1><a id="id210" name="id210">引数の省略</a>
</h1><div class="para"><div>
 関数を呼び出す際に、 <a id="id211" name="id211" class="targanchor"><dfn>...</dfn></a> のみを引数として書くと、呼び出す式を記述した関数に引き渡された引数が、そのまま関数呼び出し先の関数に引き渡されます。これは、引数変数の内容を変更していても、あるいは受け取った引数が足りなくても、正しい元の内容、引数の数がわたります。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;test()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test2(...);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;test2&nbsp;には&nbsp;test&nbsp;に渡された引数が、渡された時点のまま</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;の内容、個数で渡される</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
</div></div>
<h1><a id="id212" name="id212">引数の配列変換</a>
</h1><div class="para"><div>
 引数を配列として受け取ることができます。配列として受け取るには、引数名に '<a id="id213" name="id213" class="targanchor"><dfn>*</dfn></a>' を付けて関数を宣言します。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func(args*)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;args&nbsp;はこの関数に渡された引数を要素として持つ配列になる</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;たとえば&nbsp;func(1,&nbsp;2,&nbsp;3,&nbsp;4)&nbsp;として呼び出された場合、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;args&nbsp;には&nbsp;4&nbsp;つの要素が入っており、先頭から&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;の順で</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;数値が入っていることになる。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
 引数の途中から最後までを全て配列として受け取ることもできます。引数の数が満たなかった場合は、配列は空となります。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func(x,&nbsp;args*)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;たとえば&nbsp;func(1,&nbsp;2,&nbsp;3,&nbsp;4)&nbsp;として呼び出された場合、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;x&nbsp;には&nbsp;1&nbsp;が入る。また&nbsp;args&nbsp;には&nbsp;3&nbsp;つの要素が入っており、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;先頭から&nbsp;2&nbsp;3&nbsp;4&nbsp;の順で数値が入っていることになる。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;func(1)&nbsp;として呼び出された場合、引数の数が満たないため、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;args&nbsp;は要素のない配列となる。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
 これは、可変長の引数を処理したい場合に便利です。<br />
<br />
 引数名を指定しない事も可能です。この場合は、後述の配列の引数への展開の際に、名前なしの * として使用できます。<br />
</div></div>
<h1><a id="id214" name="id214">配列の引数への展開</a>
</h1><div class="para"><div>
 配列を展開し、引数として関数に渡すことができます。この場合は、引数の配列展開の際と同じく、展開したい式の後ろに '<a id="id215" name="id215" class="targanchor"><dfn>*</dfn></a>' を付けて関数を呼び出します。'*' を指定して展開したい式は、配列を表して無ければなりません。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;args&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3,&nbsp;4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;func(args*);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;args&nbsp;には&nbsp;1&nbsp;2&nbsp;3&nbsp;4&nbsp;の4つの要素が入っているため、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;func(1,&nbsp;2,&nbsp;3,&nbsp;4);&nbsp;と同じ意味になる。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;func(0,&nbsp;args*,&nbsp;5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;このように引数の途中に挟むことも可能。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;この場合は、func(0,&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5);&nbsp;と同じ意味に</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;なる。</span><br />
</code>
<br />
<br />
 式を指定せずに、単に * を引数に指定すると、呼び出す式を記述した関数の宣言時に書いた名前のない '*' が表す引数を、そのまま呼び出し先に渡すことができます。
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func(func_array,&nbsp;*)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;func_array&nbsp;で指定された関数に、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;その関数の&nbsp;func_array&nbsp;内の位置につづき、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;func&nbsp;に渡された&nbsp;2&nbsp;番目以降の引数を</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;そのまま引き渡して呼び出す</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;func_array.count;&nbsp;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func_array[i](i,&nbsp;*);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</code>
<br />
<br />
 名前の無い * による関数呼び出し処理は、名前のある配列を使うよりも効率よく処理できます。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func(ar*)&nbsp;{&nbsp;func2(ar*);&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func(*)&nbsp;{&nbsp;func2(*);&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;上記の二つは全く同じ意味になるが、下の例の方が効率がよい</span><br />
</code>
<br />
<br />
 名前の無い * は、「引数の省略」と同様の効果を持ちます。以下の二つの関数宣言は同じ意味になります。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func()&nbsp;{&nbsp;func2(...);&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;func(*)&nbsp;{&nbsp;func2(*);&nbsp;}<br />
</code>
<br />
</div></div>
<script type="text/javascript" charset="UTF-8" src="documentid.js" ></script>
<script type="text/javascript" charset="UTF-8" src="postcontent.js" ></script>
</body>
</html>