学習範囲

  • 『現場で使えるRuby on Rails5 速習実践ガイド』
    • 1-5-2 モジュールによる共通化(Mix-in)(P.41~)
      • (コラム)Rubyにおけるクラスメソッド
    • 1-6 例外処理
    • 1-7 Rubyっぽい書き方

方針確認

Railsポートフォリオ、言語学習方針については明日(毎週火・金)15:00~30の三者面談にて相談・決定
  • 英語学習に関しては当分の間「単語(記憶)力」に絞る
    • 脳の短期記憶領域でなく意図的に長期記憶領域に刷り込む
    • エビングハウス忘却曲線の節約率を意識する
    • 具体的には
      仮に約1ヶ月で1050単語覚えるとすれば
      毎日30単語×35日で1周とするよりも
      1週間の間210単語を毎日反復学習(1単語につき7回)×5週する(ただし単純に7倍の時間をかけはしない)
    • 1つの単語につき
      • 見て覚える(Reading)
      • 聴いて覚える(Listening)
      • 発音して覚える(Speaking)※リピートまたはシャドーイング
      • 「書いて覚える」はやらない
        理由は
        1. 時間効率が悪い
        2. 現代においてスペル暗記の必要性が薄い
        3. Writingの機会・必要性が高い人でも殆どの場合手書きでなくタイピング
          (デジタルデバイス・ツールによる自動チェック、入力候補提案/補完機能の普及)
          「そんなものに頼らない本物の英語力を身に着けなければ」とかいう拘りは殆どの場合足枷にしかならない
          そして会話に於いても重要なのはListening、Speaking(+Reading)であり、Writingは問われない。(稀である)

Tips

モジュール

  • 一連の振る舞いの設計図を一箇所にまとめたもの
  • メソッド定義はできるがインスタンス生成はできない
  • includeでクラスから取り込んで使うことができる
module Chatting  
  def chat  
    "hello"  
  end  
end  
class Dog  
  include Chatting  
end  
> pochi = Dog.new  
> pochi.chat  
=> "hello"  

同じモジュールを色々なクラスに取り込むことで、同じ振る舞いのセットを色々なクラスに簡単に追加することができる。

class Cat  
  include Chatting  
end  

class Human  
  include Chatting  
end  
  • モジュールはいわば「部分的な設計書」
  • クラスという「設計書」に共通の「部分的な設計書」を取り込むことで、複数の似た部分のあるクラスを簡単に実現できる
  • 1つのクラスに対して複数のモジュールを取り組むこともできる
module Chatting  
︙  
module Weeping  
  def weep  
    "しくしく"  
  end  
end  

class Human  
  include Chatting, Weeping  
end  
> taro = Human.new  
> taro.chat  
=> "hello"  
> taro.weep  
=> "しくしく"  
  • 以上のようにモジュールをクラスに取り込んで振る舞いを追加することをRubyではMix-inと呼ぶ
  • モジュールをうまく使うと、複数のクラスで共通している処理を1箇所にまとめることができる。

ex) 商品自体の価格と注文別の消費税計算をMix-inで共通化するコード例

# 税率クラス  
class Tax  
  # 消費税計算のクラスメソッド  
  def self.rate(percentage = 8) # 引数を省略した場合はデフォルト値の8%で計算  
    1 + percentage.to_f / 100 # 税率計算の為IntegerクラスからFloatへ型変換  
  end  
end  

# 価格についての共通機能をまとめたモジュール  
module PriceHolder  
  def total_price               
    (price * Tax.rate).to_i # ※小数点以下切り捨て計算の場合  
  end  
end  

# 商品クラス  
class Product  
  include PriceHolder  

  attr_accessor :price  
end  

# 注文クラス  
class OrderedItem  
  include PriceHolder  

  attr_accessor :unit_price, :volume  

  # 税抜き単価 * 数量  
  def price  
    unit_price * volume  
  end  
end           
> load '~/module_sample.rb'  
=> true  
> Tax.rate  
=> 1.08  
> Tax.rate 19  
=> 1.19 # ←この場限りで保持はされない  

> miyako_konbu = Product.new  
> miyako_konbu.price = 50  
> miyako_konbu.total_price  
=> 54  

> miyako_konbs = OrderedItem.new  
> miyako_konbs.unit_price = 50  
> miyako_konbs.volume = 8  
> miyako_konbs.total_price  
=> 432  

例外処理
begin  
  (例外が発生するかもしれないコード)  
rescue  
  (例外発生時の処理)  
ensure # 省略可能  
  (例外が発生してもしなくても実行したいコード)  
end  

また、メソッド内の処理全体に対して例外処理を行いたい場合は、次のようにbeginを使わずに記述できる。

def メソッド名  
  do_something  
rescue SomeSpecialError => e  
  puts "#{e.class}(#{e.message})が発生しました。"  
end  

上記ではrescue節で補足する例外クラスを指定しているが、以下のように省略も可能

rescue => e  

省略すると、StandardError及びその子クラスの例外を補足する

また、例外オブジェクトを変数として受け取る必要が無ければ => eの部分も省略できる。


Chapter 1-7

Rubyっぽい書き方

nilガード (||=)
number ||= 10  

上記は次のコードの省略形

number || (number = 10)  

「numberが存在する・真である(nilまたはfalseではない)場合はnumberをそのまま、
そうではない(偽である)場合はデフォルト値を設定する」という意味

変数にnilが入っているかもしれない状況で、nilの代わりに何らかのデフォルト値を入れておきたい場面等で便利

よくある利用法
配列のインスタンス変数@childrenへのゲッターメソッド実装

def children  
  @children ||= []  
end  

上記の場合では、@chilidrenがnilの状態であったとしても、このメソッドが呼び出された時に空の配列[]が代入されてから返されるため、childrenメソッドは決してnilを返すことがない。
故に利用する側は安心してこのメソッドのあるオブジェクトに対し、object.children.sizeなどchilidrenが配列を返すことが前提のコードを書くことができる。

ぼっち演算子 (&.)

この演算子を使ってメソッドを呼び出すと、レシーバがnilであった場合でもエラー(NoMethodError)が発生しなくなる

> object = nil  
# 通常の呼び出しではNoMethodError発生  
> object&.name  
=> nil  

※ぼっち演算子の名前の由来は文字「&.」の形から。アスキーアートのorzのようなもの

  • 使い所
    次のようにif文や三項演算子を使って書くよりも簡潔に書ける

ifを使った記述例

name = if object  
  object.name  
else  
  nil  
end  

三項演算子を使った記述例

name = object ? object.name : nil  

ぼっち演算子を使った記述例

name = object&.name  

%記法(%w, %i

全ての要素が文字列である配列では%w, 全ての要素がシンボルである配列は%iキーワードを使って書くことも可能

# 以下は同じ配列定義  
ary1 = ['apple', 'banana', 'orange']  
ary2 = %w[apple banana orange]  

ちなみにVSCodeのいずれか(恐らくはファイル保存時コード整形)の拡張機能により、メソッド引数が全てシンボルの場合などにも以下のように%i[カンマ無し]記法に自動的に書き換えられる

before_action :logged_in_user, only: [:index, :edit, :update, :destroy]  

↓ファイル保存の直後に自動的に整形される(未保存変更状態になる)

before_action :logged_in_user, only: %i[index edit update destroy]  
  • 嬉しい点
    %記法を使うことでソースコードに記述する文字数を少し減らすことができ、可読性が良くなることがある。

(所感)
積極的に使うかどうかはさておき、とりあえず(読む為に)覚えておいた方がよさげ

本日の進捗

今日も朝から夕方までかけて進んだのは6ページほど。
直上の解体工事の騒音は殆ど気にならない「のに、」というより
むしろ他の人が拾わない刺激をトリガーとする脳内雑音の方が遥かに煩い「から」ということか。