Section 1.17 引数の省略

前回で関数の基本は解ったかな?
うん、ばっちりだよ!
じゃあ、今回は関数の引数について詳しく見ていくね。
は〜い!
まず、前回メソッドも関数だって言ったよね。
うん。
じゃあ、System クラスの inform メソッドの引数の数って覚えてる?
えっと、だいたい1個だけ指定してたけど、ほんとは2個あるんだよね?
ん、そう。§1.5 で説明したよね。
第2引数はメッセージボックスのタイトルなんだけど、省略してもいいんだよね。
第2引数が省略できるのは、メソッド、つまり関数の側でデフォルト引数が決めてあるからなんだ。
デフォルト引数?
デフォルト引数っていうのは、引数が省略された時に使われる引数の値のこと。
それを関数の方で決められるの?
うん、こんな感じにね。

<デフォルト引数を持つ関数の例>

function getTime2(hour = 0, minute = 0)  // hour と minute のデフォルト値はどちらも 0 にします
{
    if(hour < 0 || minute < 0)
        return "";  // 引数の値が正しくないのでエラーと見なして空文字列を返します

    var d = new Date();
    var hr = d.getHours() + hour;
    var min = d.getMinutes() + minute;

    if(hour == 0 && minute == 0)
        return "今は " + hr + " 時 " + min + " 分です。";  // 0 時間 0 分後(つまり今の時間)の場合はこちらを返します

    hr += min \ 60;
    min %= 60;  
    hr %= 24;  
    return "今から " + hour + " 時間 " + minute + " 分後は " + hr + " 時 " + min + " 分です。";
}

これって前回作った関数に似てるみたいだけど、どんな関数なの?
これは今から hour 時間 minute 分後の時間を返す関数なんだ。
あ、だから引数が2つあるんだね。
えっと、引数の後ろについてる『= 0』っていうのがデフォルト引数の値を決めてるところ?
ん、そう。
引数の名前の後に『デフォルト値』っていう形式で、引数が省略されたときに使われるデフォルトの値を指定できるんだ。
じゃあ、例えば『getTime2(1);』を実行すると hour1minute0 になるから、 今から1時間後の時刻が返ってくるってこと?
そだよ。両方とも省略する場合は『getTime2();』ね。
この場合は hourminute が両方とも 0 になるから、 最初の if の条件式が真になって、"今は何時何分です。" っていう文字列が返ってくるよ。
あ、そう言えば return って関数の最後に書くんじゃないの?
return は関数の途中にも書けるよ。
あと、関数の中に何個書いてもいいんだ。
そうなの?
うん。で、return が実行されたらそこで終わり。
その後に書いてあるスクリプトは実行されないんだ。
ってことは、最初の if の条件式が真になったら、次の行の return の値を返して終わりなんだね。
ん、そういうこと。
あ、ちょっと引数の話に戻るんだけど、hour だけ省略したい時はどうすればいいの?
その時は『getTime2(, 10);』で OK。
なんかヘンな書き方だね。
そうかな?
getTime2(0, 10)0 が省略されてるんだからこうなるでしょ。
あ、そう言われれば、確かに 0 を取ると getTime2(, 10) になるね。
でしょ。
あと、もしデフォルトの値が決まってない引数を省略しちゃったらどうなるの?
その時は、その引数には void が指定されてると見なされるんだけど、 省略できない引数を省略すると、どんな結果になるかわからなくなっちゃうから、 省略できない引数にはちゃんと値を指定するようにしてね。
どうやったら引数が省略できるかどうか判るの?
System クラスの inform メソッドみたいに、初めから用意してあるメソッドなら、 TJS2 リファレンスか吉里吉里2リファレンスを見ればどの引数が省略できるか載ってるよ。
あ、そうなんだ。
ちなみに System.inform は吉里吉里2リファレンスの『System クラス』の『inform メソッド』の項目に載ってるよ。
ほんとだ。
構文のところに inform(text, caption="") って書いてあるね。
これって caption は省略してもよくて、省略されたら空文字列だと見なすってことだよね。
うん、そういうこと。
自分で関数を作る場合は、まぁ関数の定義を見れば判ると思うけど、 一応どの引数が省略できるかをコメントとかに書いとくとわかりやすいんじゃないかな。
なるほどね。
じゃあ、次は ... ね。
引数に『...』って書けるってこと。
あっ、そういうことなんだ。
えっと、... ってどういう意味なの?
... は関数の中で関数を呼び出す時に、 呼び出す関数に自分の引数をそのまま渡すのに使うんだ。
こんなふうに。

<『...』の使用例>

function myInform(message, caption)
{
    if(message !== void)
        System.inform(...);  // 第1引数が指定されていれば、この関数の引数をそのまま inform メソッドに渡して呼び出します
}

このスクリプトはつまりこういうこと。

<同じ意味のスクリプト>

function myInform(message, caption)
{
    if(message !== void)
        System.inform(message, caption);
}

inform メソッドの『...』が myInform 関数の引数になってる『message, caption』に置き換えられるんだね。
ん、そう。
ただし、... を使った場合は、関数が呼び出された時の引数の値が渡されるから…

function myInform2(message, caption)
{
    message = "ABC";     // ここで message の値を書き換えていますが…
    System.inform(...);  // inform メソッドには、書き換えられる前(関数が呼び出された直後)の message の値が渡されます
}

myInform2("123");

このスクリプトを実行すると、「ABC」じゃなくて、「123」って表示されるんだ。
じゃあ、関数の中で引数の値を書き換えても、書き換えられる前の値が渡されるってこと?
うん、そういうこと。
それじゃ、とりあえず今回はここまで。続きは次回ね。
ってことは、次回も引数なの?
うん。引数関係は色々説明することがあるからね。
ふぅん、そうなんだ。
というわけで、また次回ね。


前へ | TOP | 次へ