From 6c6404c4c0aef2f9ae46fc5b2067a54e6be61454 Mon Sep 17 00:00:00 2001 From: Rikuoh Date: Wed, 27 Mar 2024 22:31:58 +0900 Subject: [PATCH] 3/27 --- cherry.txt | 14 ++++++++++++-- main.rb | 34 ++++++---------------------------- main_test.rb | 26 +++++++------------------- 3 files changed, 25 insertions(+), 49 deletions(-) diff --git a/cherry.txt b/cherry.txt index cb4966d..1522b31 100644 --- a/cherry.txt +++ b/cherry.txt @@ -260,8 +260,18 @@ respond+to?:そのオブジェクトに対して特定のメソッドが呼び 316ページから ## 3/27 - - +モジュールの用途:継承を使わずにクラスにインスタンスメソッドを追加する。もしくは上書きする。2つ目は複数のクラスに対して共通の特異メソッドを追加する。3つ目はクラス名や定数名の衝突を防ぐために名前空間を作る。4つ目は関数的メソッドを定義する。5つ目はシングルトンオブジェクトのように扱って設定値などを保持する +モジュールの作り方:module モジュール名 定義 end +モジュールの特徴:モジュールからインスタンスを作成することはできない。また、ほかのモジュールやクラスを継承することもできない +ミックスイン:モジュールをクラスにincludeして機能を追加すること +extend:モジュール内のメソッドをそのクラスの特異メソッドにすることができる +特殊な呼び出し方:クラス名.includeまたはクラス名.extendの形式でも呼び出せる +文字列を1文字ずつループ処理する場合はeach_charメソッドを使う:これ知らなんだ +例題を通して:リファクタリングの一部を先に実践できたところにほのかな成長を感じた +include_modules:includeされているモジュールの配列が返る +ancestors:モジュールのみならずスーパークラスの情報も返る + +333ページから diff --git a/main.rb b/main.rb index 22a9be8..8cdd44b 100644 --- a/main.rb +++ b/main.rb @@ -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 diff --git a/main_test.rb b/main_test.rb index ef308a1..e7ece3c 100644 --- a/main_test.rb +++ b/main_test.rb @@ -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