Section 1.16 関数

今回は前回予告した通り、関数の説明をしていくね。
えっと、関数ってどういうものなの?
関数ってのは、よく使う処理をまとめたものなんだ。
KAG のマクロにちょっと似てるかな。
あ、そうなんだ。
じゃあ、関数って TJS に元々ある命令を組み合わせて、新しい命令を作るって感じなの?
まぁそんな感じだね。
よく実行する処理をまとめて関数にしとくと、毎回同じようなスクリプトを書かなくても、 関数を実行するだけでよくなるから、すごく便利なんだ。
なるほどね〜。
実は関数はもう何回も使ってるんだよね。
えっ、そうなの?
うん。例えば System.inform とか。
え、それってメソッドのこと?
そ。メソッドは関数の一種なんだ。
へぇ、そうなんだ。
というワケで、今までは関数を使うだけだったんだけど、今回は関数を作ってみるよ。
関数ってそんなに簡単に作れるの?
シンプルな関数なら簡単に作れるよ。
じゃ、まずは簡単な関数を作ってみるね。

<関数の例(2乗を計算する関数)>

function square(x)
{
    return x * x;  // x の2乗を返します
}

System.inform("4 の2乗は " + square(4) + " です。");  // 関数を呼び出します

これは引数に指定された数値の2乗を計算する関数なんだ。
ちょっと実行してみて。
うん。
……「4 の2乗は 16 です。」って表示されたね。
まず、関数を呼び出してる所はどうなってるか解るよね?
えっと、関数を呼び出すっていうのは square(4) を実行するってこと?
ん、そうだよ。
これはメソッドを使う時と同じだよね。
第1引数を 4 にして square 関数を呼び出すと、 それが 4 の2乗の 16 に置き換わるんだよね。
うん、そういうこと。じゃ、次は関数本体を見ていこっか。
1行目〜4行目が関数の定義だよ。
関数の定義って?
関数がどんなことをするのかを示すことを定義するって言うんだ。
具体的には、関数の名前や引数と、関数が呼び出された時に実行するスクリプトを書くことだね。
なるほど、そういうことね。
で、関数の定義はこんなふうに書くんだ。

<関数の定義>

function 関数名(第1引数, 第2引数, …)
{
    関数が呼び出された時に実行するスクリプト
}

じゃあ、関数の名前が square で、第1引数が x ってことだね。
そ。ちなみに関数につけられる名前は変数につけられる名前と同じだよ。
で、関数が呼び出された時に実行するスクリプトが『return x * x;』、つまり『x * x を返す』ってこと。
返す…って?
square(4) を実行すると、引数の x4 になるよね。
うん。
ってことは、x * x16 になるよね。
そだね。
そしたら『return 16;』が実行されるから、この関数は 16 を呼び出した側に返すわけ。
で、値が返されると、square(4)16 に置き換わるんだ。
じゃあ、return が「値を返すよ」って意味なの?
ん、そうだよ。
ちなみに return する値のことを戻り値って言うから覚えといてね。
うん。もどりち、ね。
もし関数が値を返す必要がなければ、戻り値はなくてもいいんだ。
あ、そうなの?
うん。例えばこんな感じ。

<戻り値のない関数の例>

function inform(message)
{
    System.inform(message);  // 引数の内容を表示します
    return;  // 値を返しません
}

return の後ろに何もないね。
単に return だけ書くと、この関数は戻り値がないよ、ってことになるんだ。
まぁ関数に戻り値がなければ、こんなふうに return は省略してもいいんだけどね。

<戻り値のない関数の例(return 省略)>

function inform(message)
{
    System.inform(message);  // 引数の内容を表示します
}

あっ、じゃあ関数の {} も省略していいんじゃない?
関数の中に命令が1つしかないし。
それはダメ。
関数の場合は必ず中身を {} で囲まなくちゃいけないんだ。
あ、そうなんだ…
じゃあ最後に問題ね。
う、うん。
第1引数を x として、 今から x 分後の時刻を文字列で返す関数 getTime を作ってみて。
ちなみに日付は考えなくても OK。
それって §1.7 で同じようなスクリプト書いてるよね?
ん、今回はあれの関数版。
あ、そういうことね。
えっと、x 分後の時刻を計算するのって、確かこんな感じだよね。

<今から x 分後の時刻を計算するスクリプト>

var x = 100;
var d = new Date();
var hour = d.getHours();
var minute = d.getMinutes() + x;
hour += minute \ 60;
minute %= 60;  
hour %= 24;  
System.inform("今から " + x + " 分後は " + hour + " 時 " + minute + " 分です。");

ん、これでいいよ。
じゃこれを関数にしてみて。
え〜っと、まず引数が x だから、最初は『function getTime(x)』になるよね。
うんうん。
それから、文字列を返すんだから、System.inform の引数を返せばいいんだよね。
ってことは…

<今から x 分後の時刻を計算する getTime 関数>

function getTime(x)
{
    var d = new Date();
    var hour = d.getHours();
    var minute = d.getMinutes() + x;
    hour += minute \ 60;
    minute %= 60;  
    hour %= 24;  
    return "今から " + x + " 分後は " + hour + " 時 " + minute + " 分です。";
}

こんな感じかな。
じゃ、呼び出す方も書いてみて。
うん。
えっと、何分後かっていうのは inputString メソッドを使って入力できるようにするの?
あー、今回は関数作るのがメインだから、適当な値を引数にして関数を呼ぶだけでいいよ。
うん、わかった。
じゃあ…

<関数の呼び出し>

System.inform(getTime(100));  // 100 分後の時刻を表示します

これでいいよね?
ん。じゃ、このスクリプトを関数の定義の後に書いてから、実行してみて。
は〜い!
……うん、ちゃんと 100 分後の時刻が表示されたよ!
ん、OK だね。
関数って結構カンタンに作れるんだね〜。
今回作ったのはシンプルな関数だからね。
でも関数にはまだ他にも機能があるから、それはまた次回説明するね。
うん、りょーかい!
それじゃ、また次回ね!


前へ | TOP | 次へ