気ままに趣味旅行

面白いコト「拡がる/拡げる」

Rubyの基礎4

f:id:hiroakies4463:20190110194257j:plain
どうもhiroakiです。

 

今回も引き続き、Rubyの基礎について紹介します。Webサイトを作ろうとしている人にとってRubyは必須の言語です。自分はとにかくウェブサイトを作ってみたい人間ですので、これをなんとか習得したいと思っています。これからまとめる内容を、みなさんもぜひ参考にしてみてください。

 

▼前回までの記事はこちらです。

hiroakies.hatenablog.com

 

lesson12

これまで、メソッドがどんなものか説明してこなかったので、このlessonで詳しく説明します。どんなものか、感覚的につかんでいきましょう。

 

メソッド

メソッドとは、複数の処理を1つにまとめ、名前をつけたものです。「def メソッド名」と「end」の間に、まとめたい処理を書いて、「定義」します。このように処理をまとめると、コードがすっきりして使いまわしもできますね。

  1. def introduce
  2.   puts "私はhiroakiです。"
  3. end
  4. introduce

1.のように、メソッド名は小文字で動詞にするのが一般的です。

メソッドは4.のようにすることで実行できます。メソッドを実行することを、「メソッドを呼び出す」と言います。

ちなみに、このintroduceメソッドは紹介をするメソッドですが、常にhiroakiしか紹介できないなら、使いまわしする際に不便ですね。ということで、次に紹介する「引数」を使うとより汎用的にできます。

 

引数(ひきすう)

引数とはメソッドに与える追加情報のようなものです。メソッドを呼び出すときに一緒に引数を渡すことで、メソッドの中でその値を利用できます。

  1. def introduce(name ="katou",age)
  2.   puts ("私は#{name}、#{age}歳です。")
  3. end
  4. introduce("hiroaki",22)
  5. introduce "hiroaki",22
  6. introduce(age=22)

メソッドの処理結果を戻り値(もどりち)と呼び、このことを「メソッドが戻り値を返す」と言います。

1.のように「def introduce(name ="katou")」のようにすると、引数のデフォルト値を設定できます。例えば、メソッドを呼び出す際、5.のようにnameを指定しなかったら、デフォルト値であるkatouが返ってきます。

またメソッドを呼び出す際、6.のように「age=」とすると指定した引数に値を入れられます。このように書くと、どの引数に対応しているか分かりやすいですね。

ちなみに、「5.のようにするとエラーになるのではないか」という疑問が湧きませんか。湧きませんね(笑)ただこの書き方は一般的でないので次第に違和感を感じるようになります。

結論から言うと、5.はきちんと動きます。上の「メソッド」のところで紹介したコードのメソッドと、このコードのメソッドを比べてみてください。上のメソッドには()がついてないですね。5.のように、メソッドのカッコ()は省略することができます。

ちなみに、自分で定義したメソッドのカッコは省略しない方が良いです。省略するのは、標準メソッドだけにするようにしましょう。

 

キーワード引数

キーワード引数は、1.行目のように引数にラベルを付けることです。

  1. def say_hello(greeting: "hello", target:)
  2.   puts "#{greeting} #{target}"
  3. end
  4. say_hello()
  5. say_hello(greeting: "こんにちは", target: "皆さん")
  6. say_hello(target: "hiroaki", greeting: "おはようございます")
  7. say_hello(target: "tom")
  8. say_hello(greeting: "おはようございます")

デフォルト値を設定する時や、呼び出すときも便利ですね。上記で紹介した「name=」より使いやすそうです。

 

リターン(return)

  1. def add(a,b)
  2.   return a + b
  3.   #もしここにコードを書いても実行されない
  4. end
  5. puts add(1,12)

メソッドの中でreturnを使うと、呼び出し元で値を受け取れるようになります。また、returnは、メソッドの処理を終了させる性質も持っているので、その後にコードを書いても実行されません。注意です。

 

引数にハッシュを指定する

  1. def introduce(name = "一般人", msg)

  2.   puts "私は#{name}です。"

  3.   puts "#{msg[:target]}、#{msg[:greeting]}。"

  4. end

  5. introduce("銀行員", {target: "世界の皆さん", greeting: "こんにちは"})
  6. introduce("住職", target: "世界の皆さん", greeting: "こんにちは")

5.のように、引数にはハッシュを指定できます。また、引数の末尾がハッシュの場合、6.のように波カッコを省略することができます。

 

メソッドをドットで連結する

  1. line = gets
  2. line = gets.chomp
  3. line = "勇者、戦士,魔法使い"
  4. p line.split(",")

実は今まで、説明もなく処理を行ってきましたが、Rubyではメソッドをドットで連結すると、前の処理の戻り値を受け取って次の処理を行うことができます。どんどん連結して使えて便利ですね。

 

スコープ

変数の使用できる範囲をスコープといいます。

メソッドを定義するときに用意した引数は、そのメソッドの中(defからendまでの間)でしか使うことができません。下のエラー例を実際に試し、確認しましょう。 

 エラー例

  1. msg = "hiroaki"
  2. def say_hello()
  3. puts "hello #{msg}"
  4. end
  5. say_hello()

 ⇓修正例⇓

  1. msg = "hiroaki"
  2. def say_hello(msg)
  3. puts "hello #{msg}"
  4. end
  5. say_hello(msg)

また、変数にはローカル変数とグローバル変数があります。

ローカル変数は、一部分でしか使用できない変数です。今まで出てきた一般的な変数だと思ってください。ブロックごとに使用できる範囲が決まっています。

グローバル変数は、スコープがなく、どこでも使える変数です。下のように先頭を「$」で始めて指定します。

  1. $msg = "hiroaki"

ただし、グローバル変数は、どこで値が代入されたのか分かりにくくなるので、あまり使うのはおすすめしません。そもそも、開発において、このように変数のスコープを分けているのは、同じ変数名が増えて予期せぬ処理が起きないよう処理ごとにコードを分けるためです。このことを意識しましょう。

 

真偽値を返すメソッド

  1. def negative?(num)
  2.   return num < 0
  3. end
  4. puts negative?(12) 

戻り値も引数と同様に、様々な値を用いることができます。
上記のように、真偽値(trueかfalse)となる値をreturnすることができますが、真偽値を返すメソッドは、メソッド名の末尾に「?」をつける慣習があるので、覚えておきましょう。これは、あくまで「習慣」なので、勿論なくても動きます。 

 

 

今回は以上です。

次回以降も同様にまとめていきます。自分も学びながらですので、間違いや意見、質問等あればコメントください。

よろしくお願いします。

ではでは。