1/15 学習記録 Ruby入門 3日目

<目標>

  • RUBY入門10章まで
  • 丁寧に作業する
  • ペースを守る

<メモ>

第8章 クラス

クラスはオブジェクトの種類を決めている

  • (オブジェクト).classでクラス名を表示
  • オブジェクトのことをクラスとの関連でインスタンスと呼ぶ

(クラス名).newでオブジェクトを作れる

Array.new("CAT","SHEEP") #=> ["CAT","SHEEP"] Array.new(2,"SHEEP") #=> ["SHEEP","SHEEP"]

クラスを定義する class (クラス名)

class (クラス名)
end 
  • 既存のクラス、新規定義されたクラスから出てきた様々なオブジェクトを組み合わせて問題を解決する
  • 頭文字には大文字を使う。クラスも定数である。
  • クラス自体もクラスというクラスに属するオブジェクト
  • クラスに属するものは共通のメソッドを使うことができる
  • オブジェクトのクラスを調べるメソッドは.class

クラスのメソッドを定義する

Class (クラス名)
    def (メソッド名)
    (メソッドの内容)
    end
end

レシーバー

  • メソッドの対象になるオブジェクト(メソッドの目的語?)のこと 2.even? の "2"がレシーバー
  • (オブジェクト).methodsによってそのレシーバーに使用可能なメソッドの一覧が得られる、.sortによって表示順を調整できる

引数を受け取るメソッドを定義する

class <クラス名>
    def <メソッド名>(変数名)
    <変数を使ったメソッド>
    end
end
  • 以降 .<メソッド名>(引数)メソッドが使える

複数のメソッドを定義

class Drink
    def name
    "コーヒー" + topping
    end
    def topping
    "ミルク入り"
    end
end
  • これは"レシーバー + ."を省略した形、その場合実行する際のレシーバに対して実行される

オブジェクトID

p (オブジェクト)で取得 プロセス中のメソッドにp selfを入れることで対象のオブジェクトIDを出力できる

ローカル変数とインスタンス変数

  • 複数のメソッドを定義する場合、ローカル変数(通常の(変数)=(値))は次のメソッドに引き継がれないため、変数に@をつけ@(変数)を使う。インスタンス変数と呼ぶ
  • それを実行したオブジェクトが存在する限りインスタンス変数に代入された値は保持される。
  • そのため、複数のオブジェクトを作ることによって、異なるインスタンス変数をそれぞれのオブジェクトに保持することができる。

インスタンス変数を引数を使って外部から定義する

class Drink
    def name=(text)
        @name=text
        end
    def item
        puts "#{@name}"
    end

name =と思いきやname=というメソッド名。 でも呼び出すときはname =と使用することができる。ビジュアル的な整合性。 また引数を表す()も省略できる。


オブジェクトを作った時点((クラス).new)で実行されるメソッド

  • initialize
class Drink
    def initialize
     @name = "カフェラテ"
    end
    ,
    ,
    

引数を渡す場合は

class Drink
    def initialize(name)
        @name = name
    end

drink=Drink.new("コーヒー")

### インスタンスメソッドとクラスメソッド

  • インスタンスメソッドはレシーバーがインスタンス(オブジェクト)のメソッド
  • クラスメソッドはレシーバーがクラス class (クラス名) def self.(メソッド名) , , , end クラスメソッドはクラスが実行するので、オブジェクトがいらない。 この方法はクラス名が変わっても有効。
    `class << self`をdefの前に入れることで self.を省略できる 、複数のクラスメソッドを定義するのに便利

メソッド名の記載方法

  • (クラス)#(メソッド) =>インスタンスメソッド
  • (クラス).(メソッド) =>クラスメソッド

インスタンスメソッドからクラスメソッドを呼び出す

self.class.(クラスメソッド名) or (クラス名).(クラスメソッド名)

クラスのメソッドの継承

class (新クラス名) < (クラス名) 引き継いだクラスを子クラス/サブクラス、引き継ぐ元のクラスを親クラス/スーパークラスと呼ぶ

親クラスの確認

  • .ancestors

  • 親クラスと同名のメソッドを定義し、親のメソッドを呼び出したい場合 メソッド定義の内容をsuperと入力する

private メソッドのアクセス制限

メソッド定義の前にprivateをつけるとそのメソッド定義の外で呼び出しができなくなる。その反対にメソッド定義の外でも中でも呼び出して使えるメソッドはpublicなメソッドと呼ぶ。定義文の中でprivatepublicを交互に入れ替えて使うことができる。

class Drink
    def staff
    makanai
    end
    private
    def makanai
    "今日の賄い"
    end
end
    

クラスメソッドのprivate設定

def self.(メソッド名)の場合

class Drink
private_class_method def self.a
                    end

class << selfの場合、インスタンスメソッドと同じように

class Drink
class << self
    private def a
    end

と書くことができる

クラスの確認

.class メソッド


第9章 モジュール

モジュールを使うことでクラス間でメソッドを共有できる

手順

  1. モジュールを作る
  2. モジュール内のメソッドを定義する
  3. モジュールをクラスで使う

モジュールの作り方

module Whippingcream
    def whipped_cream
    @name += "ホイップクリーム"
    end
end
  • 頭文字は大文字
  • クラスと違ってインスタンスを作れない、メソッドの入っているもの
  • クラスの中にincludeすることでモジュールのメソッドた利用可能になる
module WhippingCream
    def whipped_cream
        @name += "ホイップクリーム"
    end
end


class Drink
include WhippingCream
    def initialize(name)
        @name = name
    end
    def name
        "#{@name}"
    end
end

drink=Drink.new("モカ")
p drink.name

enumerableモジュール

  • 配列に関するメソッドが入っている、include先のクラスにeachメソッドがないと使えない。

extend

モジュールをクラスメソッドとして使う

module Greetings
    def greetings
    "Hello"
    end
end

class Drink
    extend Greetings
end

puts Drink.greetings

モジュールを使ってクラスメソッドを定義

module Gretings
    def self.greeting
        "Hi"
    end
end

puts Greetings.greeing

モジュール自体を使ったメソッド(クラスメソッドに似ている)

定数を定義する

module Number
 def number
 100
 end
end

put Number::number

定数をつなげる場合は(モジュール名)::(定数名)を使う。MATHはRubyデフォルトのモジュール。

puts MATH::PI

名前空間

モジュールの中にクラスを設定する。 同名のクラスであっても別名のモジュールの定数として扱うことができる

module CafeA
    class Coffee
        def self.info
            "とにかく美味しい"
        end
    end
end

module CafeB
    class Coffee
        def self.info
            "香りがいい"
        end
    end
end


puts CafeA::Coffee.info
puts CafeB::Coffee.info

CafeA::Coffee.infoCafeB::Coffee.infoでクラスを使い分けることができる

モジュールファイルを読み込み

require_relative "WhippingCream"
class Drink
    include WhippingCream
        def initialize(name)
            @name = name
        end
        def name
            "#{@name}"
        end
    end
    
    drink=Drink.new("モカ")
    drink.whipped_cream
    p drink.name
  • requre_relativeは同じフォルダに入っているファイル名を指定(.rb)省略可 requreの場合は絶対パスを入力。読み込むファイル名には""をつける。

第10章 WEBアプリを作る

GEMの確認

  • gem listでインストールされているgemのリスト表示

  • getメソッドはhttpのメソッドでページを要求している

  • http://localhost:4567/drinkは/drinkに対してhttpがgetメソッドを送っている。

ウェブページを作成

require "sinatra"
get "/drink"do # get
["大吉","吉","中吉"].sample
end

HTTPリクエストしてデータを取得

require "net/http"
require "uri"
uri = URI.parse("http://localhost:4444/drink")
puts Net::HTTP.get(uri)

11章

例外処理

  • begin - resque - end beginからresqueの間に想定される例外エラーが起きた際に行う処理をresqueからendの間に記述する

クラス変数