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 =
と使用することができる。ビジュアル的な整合性。
また引数を表す()も省略できる。
- インスタンス変数名をリスト表示
instance_variables
オブジェクトを作った時点((クラス).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なメソッドと呼ぶ。定義文の中でprivate
とpublic
を交互に入れ替えて使うことができる。
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章 モジュール
モジュールを使うことでクラス間でメソッドを共有できる
手順
- モジュールを作る
- モジュール内のメソッドを定義する
- モジュールをクラスで使う
モジュールの作り方
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.info
とCafeB::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の間に記述する
クラス変数
- @@ (インスタンス変数@に対して)