気ままに趣味旅行

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

Rubyの基礎7(完結)

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

 

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

 

▼これまでの内容は次に載せています。

hiroakies.hatenablog.com

 

lesson16

継承

あるクラスを元にして新たなクラスをつくることを「継承」といいます。これは「class 子クラス名 < 親クラス名」と「end」で作れます。このとき、子クラスは「サブクラス」、親クラスは「スーパークラス」とも呼ばれます。  

  1. class Player
  2.   def initialize(name)
  3.       @name = name
  4.     end
  5.     def meet(person)
  6.       puts "#{@name}は、#{person}に出会った"
  7.     end
  8. end
  9. class Bank_clerk < Player
  10. end

継承をすると、子クラスは親クラスのインスタンス変数とインスタンスメソッドを引き継ぎます。

 

オーバーライド

親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書き(オーバーライド)できます。オーバーライドすると、子クラスのインスタンス(実物)は、親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出します。

  1. class Player
  2.     def initialize(name)
  3.         @name = name
  4.     end
  5.     def meet(person)
  6.         puts "#{@name}は、#{person}に出会った"
  7.     end
  8. end
  9. class Bank_clerk < Player
  10.     def initialize()
  11.         super("銀行員")
  12.     end
  13.     def meet(person)
  14.         sound()
  15.         puts "#{@name}は、#{person}を抱きしめた!"
  16.     end
  17.     private
  18.     def sound()
  19.         puts "シュッ!"
  20.     end
  21.     def walk()
  22.         puts "歩いた"
  23.     end
  24. end
  25. player1 = Player.new("公務員")
  26. player2 = Player.new("お客")
  27. player3 = Bank_clerk.new()
  28. player1.meet("トム")
  29. player3.meet("トム")

上記コードについて説明していきます。

uperメソッド

12.行目参照。スーパークラスの中で、その呼び出されたメソッドと同じメソッド名を持つメソッドを探して実行します。親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要もあります。

privateメソッド

19.行目参照。privateメソッド以降のメソッドは全て外部から読み込めないようになります。 

www.javadrive.jp

www.buildinsider.net

 
 

クラスメソッド

下記の使用例を実行し、どのように動くか確認してみてください。

  1. class Player
  2.     @@person="トム"
  3.     @@count = 0
  4.     def self.charactor_count()
  5.         @@count
  6.     end
  7.     def self.person()
  8.         @@person
  9.     end
  10.     def initialize(name,person=@@person)
  11.         @name = name
  12.         @@person = person
  13.         @@count +=1
  14.     end
  15.     def meet()
  16.         puts "#{@name}は、#{@@person}に出会った"
  17.     end
  18. end
  19. class Bank_clerk < Player
  20.     def initialize()
  21.         super("銀行員")
  22.     end
  23.     def meet()
  24.         sound()
  25.         puts "#{@name}は、#{@@person}を抱きしめた!"
  26.     end
  27.     private
  28.     def sound()
  29.         puts "シュッ!"
  30.      end
  31. end
  32. player1 = Player.new("公務員")
  33. player2 = Player.new("お客")
  34. player3 = Bank_clerk.new()
  35. puts "#{Player.charactor_count()}人で#{Player.person()}に出会った~"
  36. player1.meet()
  37. player3.meet()

クラスメソッドを使うと、いちいちオブジェクトをインスタンス化(実体化)せずに、クラスを使えるようになります。

クラスメソッドは、「def クラス名.メソッド名」もしくは「def self.メソッド名」とすることで定義できます。36.行目のように、クラスメソッドを呼び出すには、クラス名に続けてメソッドを記述します。クラスメソッドはクラスの中でも、同じように呼び出すことができます。

 

33.行目以降を次のように打ち換え、どんな処理が行われるか確認してみてください。

  1. player2 = Player.new("お客","ハム")
  2. player2.meet()
  3. player1 = Player.new("公務員","トム")
  4. player3 = Bank_clerk.new()
  5. puts "#{Player.charactor_count()}人で#{Player.person()}に出会った~"
  6. player1.meet()

 

lesson17

ライブラリ

前回、ファイルを読み込む方法を説明しましたね。今回はそれを応用して、ライブラリを活用したいと思います。ライブラリには次のものがあります。

①組み込みライブラリ:プログラミングの標準的な機能を提供する。「require」メソッドなしで利用できる。
②標準添付ライブラリ:Rubyダウンロード時に配布される。「require」メソッドで利用できる。
③RubyGem:Rubyライブラリのホスティングサービス。「gem」コマンドでインストールして利用する。

 

①の例は、putsなどですね。

②の例は、日付を扱うためのDateクラスです。これを使うには下記のようにします。

  1. require "date"  #「require ("date")」でも可
  2. date1 = Date.new(2019.12.4")
  3. date2 = Date.parse("17.06.30")
  4. date3 = Date.today
  5. puts date3.sunday?

このようにすでに用意されているクラスは、自分で作ったファイルを読み込む時と比べて、1.行目のrequireの書き方が少し異なるので注意です。

Dateクラスは今まで扱ってきたクラスと同様に、Date.newとすることでインスタンスを生成することができます。

Dateクラスのクラスメソッドを使うこともできます。先ほども説明しましたが、クラスメソッドはインスタンスを作らずに3.や4.のように実行できるんでしたね。

5.のsunday?はオブジェクトが日曜日かどうかを真偽値で返すインスタンスメソッドです。

③は後日使用します。頭の片隅にでも残しておいてください。

 

lesson18

モジュール

モジュールは、定数やメソッドだけをまとめる機能です。モジュールを使うことで、共通の定数やメソッドをクラスとは分離して共有することができます。

  1. module Greeting
  2.     def say_hello()
  3.     puts "hello world"
  4.     end
  5.     module_function :say_hello
  6. end
  7. Greeting.say_hello()

5.行目のようにすると、モジュールを外部から呼び出せます。

 

モジュールをクラスに組み込む

  1. module Greeting
  2.     def say_hello()
  3.         puts "hello world"
  4.     end
  5. end
  6. class Player
  7.     include Greeting
  8.     def introduce()
  9.         puts "私は、hiroakiです。"
  10.     end
  11. end
  12.  
  13. player = Player.new()
  14. player.say_hello()
  15. player.introduce()

8.のように「include モジュール名」とすることで、クラスに組み込むこともできます。

 

www.javadrive.jp

qiita.com

qiita.com

 

 

基礎編は以上になります。お疲れ様でした!

内容については、さらっと流したところもありまして、非常に申し訳ないです。今後、補足など順次まとめますので、読んでみてください。

また、自分も学びながらですので、間違いや意見、質問等あればコメントください。

次回以降は実際にウェブサイトを作っていきたいと思います。うまくいくか分かりませんが、これからもよろしくお願いします。

ではでは。