From 0ce6b5c4beb66da14e38a18d57dd80c76229f8f7 Mon Sep 17 00:00:00 2001 From: Rikuoh Date: Fri, 29 Mar 2024 22:34:24 +0900 Subject: [PATCH] 3/29 --- cherry.txt | 32 +++++++++++++++++++++++++++++++- main.rb | 24 +++++++++++++++++------- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/cherry.txt b/cherry.txt index 6944c57..bba73e2 100644 --- a/cherry.txt +++ b/cherry.txt @@ -280,7 +280,7 @@ Kernelモジュールの秘密:ObjectクラスがKernelモジュールをinclu クラス以外のオブジェクトにextendする:この場合、モジュールのメソッドはextendしたオブジェクトの特異メソッドになる トップレベルにメソッドを定義すると:Objectクラスに定義される。つまりトップレベルに定義したメソッドは事実上のグローバルメソッドになる 名前空間としてのモジュール:モジュール構文の中にクラス定義を書くと「そのモジュールに属するクラス」という意味になるので、同名のクラスがあっても名前の衝突は発生しなくなる -入れ子なしで名前空間付きのクラスを定義する:名前空間として使うモジュールがすでにどこかに定義されている場合は、モジュール構文やクラス構文を入れ子にしなくてもモジュール名::クラス名のような形でクラスを定義することもできます +入れ子なしで名前空間付きのクラスを定義する:名前空間として使うモジュールがすでにどこかに定義されている場合は、モジュール構文やクラス構文を入れ子にしなくてもモジュール名::クラス名のような形でクラスを定義することもできる クラスの探索:Rubyではクラスやモジュールの入れ子関係を順に外側に向かってクラスを探索する モジュールに特異メソッドを定義する:モジュール単体でそのメソッドを呼び出したい時、モジュール自身に特異メソッドを定義すれば直接モジュール名.メソッド名の形式でメソッドを呼び出すことができる module_functionメソッド:モジュールではミックスインとしてもモジュールの特異メソッドとしても使えるメソッドをこれで定義できる @@ -293,4 +293,34 @@ refinements:独自のスコープを設定できる。有効にするにはusi 二重コロンとドットの違い:名前空間を区切ったり定数を参照したりするときは二重コロンを使い、メソッドを呼び出す場合はドットを使うのが典型的な使い分け。ただしメソッドの呼び出しに関しては二重コロンも使おうと思えば使える。逆はできない 366ページから +## 3/29 +TypeError:Rubyでは例外も例外クラスのインスタンスになっている。TypeErrorは例外オブジェクトのクラス名 +予期しない補足:例外が発生した箇所がbegin〜rescueで囲まれていない場合、例外が発生するとそこで処理を中断してメソッドの呼び出しを1つずつ戻っていく。途中に例外を補足するコードがあればそこから処理を続行する +backtraceメソッド:バックトレース情報を配列にして返す +messageメソッド:例外発生時のエラーメッセージを返す +NoMethodError:これも例外クラスの一つ。存在しないメソッドを呼び出した時に現れる +ZeroDivisionError:0で除算した時に現れる例外クラスの一つ。 +例外クラスの指定: +begin +例外が起きうる処理 +rescue 補足したい例外クラス +例外が発生した場合の処理 +end +のような形式で特定の例外が起こった場合にのみ捕捉させることができる +例外クラスの継承関係:すべての例外クラスはExceptionクラスを継承しており、そこから下はStandardErrorのサブクラスとそれ以外の例外クラスに分かれている。 +rescure節の挙動:なにもクラスを指定しなかった場合にはStandardErrorとそのサブクラスが捕捉される。指定した場合はそのクラス自身とサブクラスが捕捉される +捕捉すべき対象:最上位のExceptionクラスを指定するとNoMemoryErrorなど特殊なエラーも対象に含めてしまうため、通常はStandardErrorかそのサブクラスに捕捉対象を限定すべきである +例外を書く順番:スーパークラスよりも手前にサブクラスを書く +retry:例外発生時に処理をやり直させることができる。 +rescue + retry +end +ただし無限ループを防ぐために回数を制限するのが望ましい +raiseの引数:第1引数に例外クラス、第2引数にエラーメッセージを渡すとRuntimeErrorクラス以外の任意の例外クラスで例外を発生させることができる +full_message:例外のクラス名、エラーメッセージ、バックトレースをすべて出力するメソッド +Date.valid_date?:正しい日付かどうか確認できる +ensure:例外の有無にかかわらず処理を実行させる +392ページから + + diff --git a/main.rb b/main.rb index 8cdd44b..8a14c3a 100644 --- a/main.rb +++ b/main.rb @@ -1,8 +1,18 @@ -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 +print 'Text?: ' +text = gets.chomp + +begin + print 'Pattern?: ' + pattern = gets.chomp + regexp = Regexp.new(pattern) +rescue RegexpError => e + puts "Invalid pattern: #{e.message}" + retry +end + +matches = text.scan(regexp) +if matches.size > 0 + puts "Matched: #{matches.join(', ')}" +else + puts 'Nothing matched.' end