いちいち入力せずに、何度も“Hello”と言いたい時にはどうすればいいでしょうか? メソッドを定義しましょう!
def hi
というコードがメソッド定義のはじまりになります。
これは、hi
という名前のメソッドを定義しようとしていることをRubyに伝えるものです。
次の行はメソッドの本体になります。この行は、すでに見た行、puts "Hello World"
と
同じものです。
そして、最後の行の end
は、メソッド定義が終わったことをRubyに伝えます。
Rubyのレスポンス => :hi
は、メソッド定義の終了を理解したことを表しています。
なお、Ruby 2.0やそれ以前のバージョンのRubyでは、このレスポンスは => nil
になります。が、その違いはここでは特に重要なことではないので、先に進みます。
簡潔で繰り返せるメソッド
それではこのメソッドを何度か実行してみましょう。
簡単ですね。Rubyでのメソッド呼び出しはその名前をRubyに伝えるのと同じくらい簡単です。 引数がなければ、名前以外は不要です。 メソッドが引数を持たない場合、メソッド名の後ろに空のカッコをつけることができますが、 省略しても構いません。
全世界ではなく、特定の人にhelloと言いたい場合はどうすればいいでしょうか?
名前を引数としてとるようにhi
を再定義すればいいのです。
ちゃんと動いているようです。しかし、ここで何が起きているのか、ちょっと詳しく見てみましょう。
Stringに穴を開ける
#{name}
とは一体何なのでしょうか。これは、文字列に何かを挿入する際の
Rubyでのやり方なのです。
ブレースの間にあるものは(もし文字列でなければ)文字列に変換され、
その外側の文字列の中に置き換えられます。
このしくみは、誰かの名前を正しくcapitalizedするのにも使えます。
ここでは他にもいろいろなトリックが使われています。
一つはカッコなしでメソッド呼び出しが使われていることです。
何をやっているか明確であれば、カッコは省略できます。
それ以外のトリックは、デフォルト引数のWorld
です。
これは、「もしnameが与えられなければ、nameのデフォルト値である"World"
を
使う」という定義になります。
挨拶人(Greeter)への進化
もし本物の挨拶人がいたのなら、あなたの名前を覚えてくれる上、 歓迎し、いつでも丁重に扱ってくれるでしょう。 そのためにオブジェクトを使いたくなりそうです。 “Greeter”クラスを作ってみましょう。
新しいキーワードはclass
です。これはGreeterという新しいクラスと、
そのクラスのメソッドをいくつか定義しています。また、@name
にも
気づいたかもしれません。これはインスタンス変数で、このクラスにある
全てのメソッドで使うことができます。見ての通り、
say_hi
と say_bye
で使われています。
さて、どうすればこのGreeterクラスを動かせるでしょうか? オブジェクトを作りましょう。