Rubyの基礎7(完結)
どうもhiroakiです。
今回も引き続き、Rubyの基礎について紹介します。Webサイトを作ろうとしている人にとってRubyは必須の言語です。自分はとにかくウェブサイトを作ってみたい人間ですので、これをなんとか習得したいと思っています。これからまとめる内容を、みなさんもぜひ参考にしてみてください。
▼これまでの内容は次に載せています。
lesson16
継承
あるクラスを元にして新たなクラスをつくることを「継承」といいます。これは「class 子クラス名 < 親クラス名」と「end」で作れます。このとき、子クラスは「サブクラス」、親クラスは「スーパークラス」とも呼ばれます。
- class Player
- def initialize(name)
- @name = name
- end
- def meet(person)
- puts "#{@name}は、#{person}に出会った"
- end
- end
- class Bank_clerk < Player
- end
継承をすると、子クラスは親クラスのインスタンス変数とインスタンスメソッドを引き継ぎます。
オーバーライド
親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書き(オーバーライド)できます。オーバーライドすると、子クラスのインスタンス(実物)は、親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出します。
- class Player
- def initialize(name)
- @name = name
- end
- def meet(person)
- puts "#{@name}は、#{person}に出会った"
- end
- end
- class Bank_clerk < Player
- def initialize()
- super("銀行員")
- end
- def meet(person)
- sound()
- puts "#{@name}は、#{person}を抱きしめた!"
- end
- private
- def sound()
- puts "シュッ!"
- end
- def walk()
- puts "歩いた"
- end
- end
- player1 = Player.new("公務員")
- player2 = Player.new("お客")
- player3 = Bank_clerk.new()
- player1.meet("トム")
- player3.meet("トム")
上記コードについて説明していきます。
uperメソッド
12.行目参照。スーパークラスの中で、その呼び出されたメソッドと同じメソッド名を持つメソッドを探して実行します。親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要もあります。
privateメソッド
19.行目参照。privateメソッド以降のメソッドは全て外部から読み込めないようになります。
クラスメソッド
下記の使用例を実行し、どのように動くか確認してみてください。
- class Player
- @@person="トム"
- @@count = 0
- def self.charactor_count()
- @@count
- end
- def self.person()
- @@person
- end
- def initialize(name,person=@@person)
- @name = name
- @@person = person
- @@count +=1
- end
- def meet()
- puts "#{@name}は、#{@@person}に出会った"
- end
- end
- class Bank_clerk < Player
- def initialize()
- super("銀行員")
- end
- def meet()
- sound()
- puts "#{@name}は、#{@@person}を抱きしめた!"
- end
- private
- def sound()
- puts "シュッ!"
- end
- end
- player1 = Player.new("公務員")
- player2 = Player.new("お客")
- player3 = Bank_clerk.new()
- puts "#{Player.charactor_count()}人で#{Player.person()}に出会った~"
- player1.meet()
- player3.meet()
クラスメソッドを使うと、いちいちオブジェクトをインスタンス化(実体化)せずに、クラスを使えるようになります。
クラスメソッドは、「def クラス名.メソッド名」もしくは「def self.メソッド名」とすることで定義できます。36.行目のように、クラスメソッドを呼び出すには、クラス名に続けてメソッドを記述します。クラスメソッドはクラスの中でも、同じように呼び出すことができます。
33.行目以降を次のように打ち換え、どんな処理が行われるか確認してみてください。
- player2 = Player.new("お客","ハム")
- player2.meet()
- player1 = Player.new("公務員","トム")
- player3 = Bank_clerk.new()
- puts "#{Player.charactor_count()}人で#{Player.person()}に出会った~"
- player1.meet()
lesson17
ライブラリ
前回、ファイルを読み込む方法を説明しましたね。今回はそれを応用して、ライブラリを活用したいと思います。ライブラリには次のものがあります。
①組み込みライブラリ:プログラミングの標準的な機能を提供する。「require」メソッドなしで利用できる。
②標準添付ライブラリ:Rubyダウンロード時に配布される。「require」メソッドで利用できる。
③RubyGem:Rubyライブラリのホスティングサービス。「gem」コマンドでインストールして利用する。
①の例は、putsなどですね。
②の例は、日付を扱うためのDateクラスです。これを使うには下記のようにします。
- require "date" #「require ("date")」でも可
- date1 = Date.new(2019.12.4")
- date2 = Date.parse("17.06.30")
- date3 = Date.today
- puts date3.sunday?
このようにすでに用意されているクラスは、自分で作ったファイルを読み込む時と比べて、1.行目のrequireの書き方が少し異なるので注意です。
Dateクラスは今まで扱ってきたクラスと同様に、Date.newとすることでインスタンスを生成することができます。
Dateクラスのクラスメソッドを使うこともできます。先ほども説明しましたが、クラスメソッドはインスタンスを作らずに3.や4.のように実行できるんでしたね。
5.のsunday?はオブジェクトが日曜日かどうかを真偽値で返すインスタンスメソッドです。
③は後日使用します。頭の片隅にでも残しておいてください。
lesson18
モジュール
モジュールは、定数やメソッドだけをまとめる機能です。モジュールを使うことで、共通の定数やメソッドをクラスとは分離して共有することができます。
- module Greeting
- def say_hello()
- puts "hello world"
- end
- module_function :say_hello
- end
- Greeting.say_hello()
5.行目のようにすると、モジュールを外部から呼び出せます。
モジュールをクラスに組み込む
- module Greeting
- def say_hello()
- puts "hello world"
- end
- end
- class Player
- include Greeting
- def introduce()
- puts "私は、hiroakiです。"
- end
- end
- player = Player.new()
- player.say_hello()
- player.introduce()
8.のように「include モジュール名」とすることで、クラスに組み込むこともできます。
基礎編は以上になります。お疲れ様でした!
内容については、さらっと流したところもありまして、非常に申し訳ないです。今後、補足など順次まとめますので、読んでみてください。
また、自分も学びながらですので、間違いや意見、質問等あればコメントください。
次回以降は実際にウェブサイトを作っていきたいと思います。うまくいくか分かりませんが、これからもよろしくお願いします。
ではでは。
Rubyの基礎6
どうもhiroakiです。
今回も引き続き、Rubyの基礎について紹介します。Webサイトを作ろうとしている人にとってRubyは必須の言語です。自分はとにかくウェブサイトを作ってみたい人間ですので、これをなんとか習得したいと思っています。これからまとめる内容を、みなさんもぜひ参考にしてみてください。
▼これまでの内容は次に載せています。
lesson14
initializeメソッド
initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出され、処理が実行されます。これを初期化(initialize)と言います。
- class Menu
- attr_accessor :name
- def initialize
- self.name = "ピザ"
- end
- end
- menu1 = Menu.new
- puts menu1.name
initializeメソッドは、他のインスタンスメソッドと同じように定義できます。インスタンスメソッドの中では、「self.変数名」でインスタンス変数を扱うことができるので、「self.変数名 = 値」でインスタンス変数に値を代入できます。
initializeメソッドには、通常のインスタンスメソッドと同じように、引数を渡すこともできます。
- class Menu
- def initialize(message)
- puts message
- end
- end
- menu1 = Menu.new("こんにちは")
initializeメソッドでインスタンス変数に引数の値を代入することで、インスタンス毎にインスタンス変数の値を変えることができます。
その際に、キーワード引数を使うことで見やすく書くことができます。
- class Menu
- def initialize(name:,price:)
- self.name = name
- self.price=price
- end
- end
- menu1 = Menu.new(name:"ピザ",price:1200)
- puts menu1.name #エラー
ちなみに、これはattr_accessorがないので、8.のようにするとエラーになります。
補足
インスタンスメソッドは次のように書くこともできます。
- class Menu
- def initialize(name:,price:)
- @name = name
- @price = price
- end
- def order
- puts "#{@name}、#{@price}円分ですね?"
- end
- end
- menu1 = Menu.new(name:"ピザ",price:1200)
- puts menu1.order
クラス変数
クラス変数は宣言したクラスのインスタンス全てで共有して利用できる変数です。変数名の先頭に「@@」を付けて作ります。
- class Goods
- @@tax = 1.08
- def initialize(price, quantity)
- @price = price
- @quantity = quantity
- end
- def total()
- return (@price * @quantity * @@tax).round
- end
- end
roundメソッドは数を四捨五入します。
classメソッド
- text = "123"
- list=["hiroaki","tom","keiko"]
- p text.to_i
- p text.length
- p text.class
- p "123".class
- p list.class
実は、Rubyでは、文字列や配列はオブジェクトになっています。なので、こういう書き方になっているんですね。ためしに、classメソッドを使って、文字列や配列がどのクラスに属したオブジェクトか調べてみましょう。
どうですか?感覚的には伝わりましたか。
では、これを踏まえて次のコードをおさらいです。
- line = gets.chomp.split(",")
- puts line
lesson15
クラスを移動する
これまでクラスについて説明してきました。
さて、このクラスをファイルごとに移動して分け、そこから呼び出すことで使う方法がありますので、説明します。
まず、さきほど使ったコードでgoods.rbファイルを作ります。
- #goods.rb
- class Goods
- @@tax = 1.08
- def initialize(price, quantity)
- @price = price
- @quantity = quantity
- end
- def total()
- return (@price * @quantity * @@tax).round
- end
- end
上記ファイル内のクラスを、index.rbファイルで使うようにします。
- #index.rb
- require "./goods"
- goods = Goods.new
読み込む側のファイルの一番上の行で「require "./menu"」のコードを書き込むことで、「goods.rb」を読み込めるようになります。
次のlessonで「継承」について扱いますが、このクラスを移動することをしっかり覚えておいてくださいね。
今回は以上です。
次回以降も同様にまとめていきます。自分も学びながらですので、間違いや意見、質問等あればコメントください。難しい項ですので、理解できない場合は気軽にご質問ください。
よろしくお願いします。
ではでは。