8. 関数(機能を作る)
よく使うコードを一つの機能にまとめましょう。
よく繰り返されるコードは、〈名前〉(山括弧)を使って関数にしておけば、いつでも呼び出して実行できますよ!
名前とタイプを受け取って挨拶してくれる簡単な機能を作ってみましょうか?
〈挨拶する〉を作ろう(【文字列】の『名前』):
枠「{『名前』}さん、こんにちは!」を出力しよう
〈挨拶する〉(「お客様」)を実行しよう
〈挨拶する〉(「山田太郎」)を実行しよう
機能の中で計算をして、その結果を外に返すこともできます。 数字を二つ足して結果を返す機能を作ってみましょう。返す値のタイプもあらかじめ決めておくことができますよ!
【数字】を返す〈足し算〉を作ろう(【数字】の『あ』,【数字】の『い』):
『結果値』を【数字】の『あ』+『い』にしよう
『結果値』を返そう
『総和』を【数字】の〈足し算〉(10,20)にしよう
枠「足し算の結果:{『総和』}」を出力しよう
返す値がない関数でも、複雑な過程を一つにまとめておくと、コードがずっとすっきりしますよ!
〈ゲーム開始〉を作ろう():
「ゲームを準備します...」を出力しよう
「キャラクターを生成します...」を出力しよう
「スタート!」を出力しよう
〈ゲーム開始〉()を実行しよう
材料(引数)を渡す方法: CBO (Call by Object)
関数に値(材料)を渡す時、データのタイプによって動作の仕方が少し違います。これを普通、オブジェクト参照による渡し(Call By Object Reference) と呼びます。 PythonやJavaScriptのように、カナデ(Kanade)でも同じように動作しますよ。
- 数値、文字列、論理(プリミティブ型): 値をコピーして渡します。つまり、関数の中で値をあれこれ操作しても、外にある元の変数には影響がありません!
- リスト、辞書、オブジェクト(参照型): 元のデータの「アドレス(参照)」を渡します。関数の中で中身を修正すると、外の元のデータも一緒に変わりますよ!
実際に目で確認してみましょうか?
〈数字を変える〉を作ろう(【数字】の『値』):
『値』に10を足そう
〈辞書を変える〉を作ろう(【(文字列,何でも)辞書】の『辞書』):
『辞書』の「状態」を「変わった」にしよう
(参考)1.数字を渡してみますね
『私の数字』を【数字】の5にしよう
〈数字を変える〉(『私の数字』)を実行しよう
枠「数字は:{『私の数字』}」を出力しよう(参考:相変わらず5が出力されます)
(参考)2.辞書を渡してみますね
『私の辞書』を【(文字列,何でも)辞書】の{「状態」:「変わってない」}にしよう
〈辞書を変える〉(『私の辞書』)を実行しよう
枠「辞書の状態は:{『私の辞書』の「状態」}」を出力しよう(参考:「変わった」に変化しています!)
このようにリストや辞書を渡す時は、元のデータが変わる可能性があるという点をぜひ覚えておいてくださいね!
材料(引数)を間違えて渡すとどうなるでしょうか?
関数を呼び出す時、必要な引数(材料)を渡さなかったり、多すぎたりすると、カナデが親切に止めてくれます。
【数字】を返す〈二倍に〉を作ろう(【数字】の『数字』):
(『数字』*2)を返そう
(参考)あっ!渡すべき数字を忘れてそのまま実行しました!
『結果』を【数字】の〈二倍に〉()にしよう
実行してみると、“MissingArgumentError: 関数の実行に必要な引数が欠落しています。”というエラーが出ますよ。
反対に、材料を多すぎに渡すとどうなるでしょうか?
【数字】を返す〈二倍に〉を作ろう(【数字】の『数字』):
(『数字』*2)を返そう
(参考)数字一つだけ必要なのに、3つも渡してしまいました!
『結果』を【数字】の〈二倍に〉(10,20,30)にしよう
この時は“ArgumentError: 関数に渡された引数の数が多すぎます。”と言って弾かれます。関数が要求する正確な材料の数を合わせて入れてあげることが重要ですよ!