This commit is contained in:
Rikuoh Tsujitani 2024-03-27 22:31:58 +09:00
parent 19140234a0
commit 6c6404c4c0
Signed by: riq0h
GPG key ID: 010F09DEA298C717
3 changed files with 25 additions and 49 deletions

View file

@ -260,8 +260,18 @@ respond+to?:そのオブジェクトに対して特定のメソッドが呼び
316ページから
## 3/27
モジュールの用途継承を使わずにクラスにインスタンスメソッドを追加する。もしくは上書きする。2つ目は複数のクラスに対して共通の特異メソッドを追加する。3つ目はクラス名や定数名の衝突を防ぐために名前空間を作る。4つ目は関数的メソッドを定義する。5つ目はシングルトンオブジェクトのように扱って設定値などを保持する
モジュールの作り方module モジュール名 定義 end
モジュールの特徴:モジュールからインスタンスを作成することはできない。また、ほかのモジュールやクラスを継承することもできない
ミックスインモジュールをクラスにincludeして機能を追加すること
extendモジュール内のメソッドをそのクラスの特異メソッドにすることができる
特殊な呼び出し方:クラス名.includeまたはクラス名.extendの形式でも呼び出せる
文字列を1文字ずつループ処理する場合はeach_charメソッドを使うこれ知らなんだ
例題を通して:リファクタリングの一部を先に実践できたところにほのかな成長を感じた
include_modulesincludeされているモジュールの配列が返る
ancestorsモジュールのみならずスーパークラスの情報も返る
333ページから

34
main.rb
View file

@ -1,30 +1,8 @@
class Gate
STATIONS = [:umeda, :juso, :mikuni]
FARES = [160, 190]
def initialize(name)
@name = name
end
def enter(ticket)
ticket.stamp(@name)
end
def exit(ticket)
fare = calc_fare(ticket)
fare <= ticket.fare
end
def calc_fare(ticket)
from = STATIONS.index(ticket.stamped_at)
to = STATIONS.index(@name)
distance = to - from
FARES[distance - 1]
end
end
class Ticket
attr_reader :fare, :stamped_at
def initialize(fare)
@fare = fare
end
def stamp(name)
@stamped_at = name
module Rainbowable
def rainbow
to_s.each_char.map.with_index do |char, count|
color = 31 + count % 6
"\e[#{color}m#{char}"
end.join + "\e[0m"
end
end

View file

@ -1,26 +1,14 @@
require 'minitest/autorun'
require_relative 'main'
class GateTest < Minitest::Test
class RainbowableTest < Minitest::Test
def setup
@umeda = Gate.new(:umeda)
@juso = Gate.new(:juso)
@mikuni = Gate.new(:mikuni)
Object.include Rainbowable
end
def test_umeda_to_juso
ticket = Ticket.new(160)
@umeda.enter(ticket)
assert @juso.exit(ticket)
end
def test_umeda_to_mikuni_when_fare_is_not_enough
ticket = Ticket.new(190)
@umeda.enter(ticket)
assert @mikuni.exit(ticket)
end
def test_juso_to_mikuni
ticket = Ticket.new(160)
@juso.enter(ticket)
assert @mikuni.exit(ticket)
def test_rainbow
expected = "\e[31mH\e[32me\e[33ml\e[34ml\e[35mo\e[36m,\e[31m \e[32mw\e[33mo\e[34mr\e[35ml\e[36md\e[31m!\e[0m"
assert_equal expected, 'Hello, world!'.rainbow
expected = "\e[31m[\e[32m1\e[33m,\e[34m \e[35m2\e[36m,\e[31m \e[32m3\e[33m]\e[0m"
assert_equal expected, [1, 2, 3].rainbow
end
end