関数について

・Exercise18:名前、変数、コード、関数について

ここでは、関数というものを扱っていきます。

関数というのは、以下の3つのことを行います。

  1. 関数というのは、変数が文字列と数字を明示するようにコードの一部を明示する。
  2. スクリプトが”ARGV”を引数として取るように、関数も引数を必要とする。
  3. 1と2から、関数というのはオリジナルのミニスクリプトかささやかなコマンドのようなものを作るようなものである。

Rubyでは、”def”を使って関数を作ることができます。
このエクササイズでは4つの関数を作成し、それらがどのように関連しあっているか確認してみましょう。

最初の関数”print_two”では、今までのスクリプト作成から学んできたことに最も近いことが行われています。
もう少し最初の関数を、具体的に噛み砕いて見ていきましょう。

  1. 最初にRubyに対して、その定義のために”def”を使って関数を作成すると告げる。
  2. “def”と同じ行に、関数名を記述する。ここでは”print_two”としていますが、実際は何でもいいです。基本的に短くて、その関数が何をするものかわかればいいでしょう。
  3. “argv”の場合のように、関数に”*args”が必要だと伝える。
  4. ここまでできたら1行目は終わりで、enterキーを押して次の行に移り、インデンティングを始める。
  5. 新しい行から最後の”end”までいったら、そこが”print_two”の中身になる。最初の部分は、以前のスクリプトでやった引数をアンパックするのと同様です。
  6. 以前のスクリプトの場合と同じように、関数がどのように動くか確かめるため、引数を出力する。

“print_two”における問題点は、関数を作成するうえで1番簡単ではないということです。
Rubyでは引数のアンパックをスキップし、”()”の中に引数を記述することができます。
そうやっているのが、”print_two_again”の部分です。

その後が1つの引数で動く関数の例で、”print_one”の部分です。

そして最後が、引数なしで動く関数”print_none”になります。

出力結果について

以下のようになります。

これで関数がどのように動くか少しは理解できたと思いますが、これは”exists”や”open”、更に他のコマンドが動くのと原理は同じです。
実は、Rubyにおけるコマンドは関数でもあるんです。
これが意味するのは、関数作成というのは自分自身でオリジナルのコマンドを作成し、それをスクリプト上で実行しているということです。

学習ドリル

後のエクササイズのために、関数チェックリストを作成してみましょう。
インデックスカードに記入して、残りのエクササイズが終了する、あるいはそれらが必要なくなるまで保管しておいてください。

  1. 関数の定義は”def”から始めたでしょうか?
  2. 関数名は、文字とアンダースコアだけになっているでしょうか?
  3. 関数名のすぐ後に、”(”が入っているでしょうか?
  4. 引数は、”(“の後にカンマで区切られて入っているでしょうか?
  5. それぞれの引数は、名前に重複がないでしょうか?
  6. 引数を指定した後に、”)”で閉じているでしょうか?
  7. 関数内の全てのコードを、ずらして記入しましたか?
  8. 最初のdef”に続き、関数の最後は”end”で終わらせましたか?

関数を実行する(run 0r use or call)とき、以下のことをチェックしてみてください。

  1. この関数の実行時(run or use or call)、その名前を打ちましたか?
  2. 関数の実行時、その名前の後に”(“を打ちましたか?
  3. カンマで区切られた丸括弧の中に、変数を入れましたか?
  4. 関数の最後に、”)”を入力しましたか?
  5. 実は、関数の実行時に引数が必要ない場合は”()”なしでも構いませんが、今は書いておいた方が理解しやすいのではないでしょうか?

上の2つのチェックリストは、不要になるまでしっかり活用してください。

最後に、自分自身に以下のことを言い聞かせてください。

"To 'run,' 'call,' or 'use' a function all mean the same thing."