This commit is contained in:
Rikuoh Tsujitani 2024-03-29 22:34:24 +09:00
parent df5d0a163d
commit 0ce6b5c4be
Signed by: riq0h
GPG key ID: 010F09DEA298C717
2 changed files with 48 additions and 8 deletions

View file

@ -280,7 +280,7 @@ Kernelモジュールの秘密ObjectクラスがKernelモジュールをinclu
クラス以外のオブジェクトにextendするこの場合、モジュールのメソッドはextendしたオブジェクトの特異メソッドになる
トップレベルにメソッドを定義するとObjectクラスに定義される。つまりトップレベルに定義したメソッドは事実上のグローバルメソッドになる
名前空間としてのモジュール:モジュール構文の中にクラス定義を書くと「そのモジュールに属するクラス」という意味になるので、同名のクラスがあっても名前の衝突は発生しなくなる
入れ子なしで名前空間付きのクラスを定義する:名前空間として使うモジュールがすでにどこかに定義されている場合は、モジュール構文やクラス構文を入れ子にしなくてもモジュール名::クラス名のような形でクラスを定義することもできます
入れ子なしで名前空間付きのクラスを定義する:名前空間として使うモジュールがすでにどこかに定義されている場合は、モジュール構文やクラス構文を入れ子にしなくてもモジュール名::クラス名のような形でクラスを定義することもでき
クラスの探索Rubyではクラスやモジュールの入れ子関係を順に外側に向かってクラスを探索する
モジュールに特異メソッドを定義する:モジュール単体でそのメソッドを呼び出したい時、モジュール自身に特異メソッドを定義すれば直接モジュール名.メソッド名の形式でメソッドを呼び出すことができる
module_functionメソッドモジュールではミックスインとしてもモジュールの特異メソッドとしても使えるメソッドをこれで定義できる
@ -293,4 +293,34 @@ refinements独自のスコープを設定できる。有効にするにはusi
二重コロンとドットの違い:名前空間を区切ったり定数を参照したりするときは二重コロンを使い、メソッドを呼び出す場合はドットを使うのが典型的な使い分け。ただしメソッドの呼び出しに関しては二重コロンも使おうと思えば使える。逆はできない
366ページから
## 3/29
TypeErrorRubyでは例外も例外クラスのインスタンスになっている。TypeErrorは例外オブジェクトのクラス名
予期しない補足例外が発生した箇所がbegin〜rescueで囲まれていない場合、例外が発生するとそこで処理を中断してメソッドの呼び出しを1つずつ戻っていく。途中に例外を補足するコードがあればそこから処理を続行する
backtraceメソッドバックトレース情報を配列にして返す
messageメソッド例外発生時のエラーメッセージを返す
NoMethodErrorこれも例外クラスの一つ。存在しないメソッドを呼び出した時に現れる
ZeroDivisionError0で除算した時に現れる例外クラスの一つ。
例外クラスの指定:
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ページから

24
main.rb
View file

@ -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