Rubyと仲良くなりたい٩( 'ω' )و

Rubyと仲良くなりたい日々のこと

例外クラス StandardError

例外クラスのStandardErrorとそのサブクラスという階層のことをまとめました。

例外クラスについて

Rubyの例外処理において、例外クラスを指定しない場合StandardErrorとそのサブクラスが補足されます。
StandardErrorとそのサブクラスとは?

StandardError

StandardErrorとは、

通常のプログラムで発生する可能性の高い 例外クラスを束ねるためのクラスです。

引用元: class StandardError (Ruby 2.5.0)

そのサブクラス

サブクラスとは親子関係のあるクラスの子の方のことで、親のメソッドを継承しています。
こういった階層構造と考えるとわかりやすそうです。

Exception(全ての例外の祖先)  
 ∟StandardError
   ∟サブクラス達

で、StandardErrorのサブクラスは、つまるところ通常のプログラムで発生する可能性の高い 例外クラスです。
具体的にはこちらです。

ArgumentError
EOFError
EncodingError
FiberError
FloatDomainError
IOError
IndexError
KeyError
LocalJumpError
NameError
NoMethodError
RangeError
RegexpError
RuntimeError
StandardError
StopIteration
SystemCallError
ThreadError
TypeError
ZeroDivisionError

Ruby 2.5.0 リファレンスマニュアル > 組み込みライブラリ > 例外クラスが、構造と内容を確認するには最適です。
ただ、上記のように一覧だけを確認したい場合については、ancestorsを利用するのが便利です。上記のStandardErrorのサブクラス一覧を表示するにあたっては、こちらの記事を参照させていただきました。さらに祖先のExceptionクラスにも触れていてとても参考になりましたmm

randd.kwappa.net

ControllerとViewの共通処理をConcernに書いた話

はじめに

Concernという存在を知ったので、まとめました。

Concernとは

どういうものなのか

Ruby on RailsActiveSupport( Active Support Core Extensions )の一つです。

モジュールを利用してMix-inする時に、複雑なコードを書かなくていいようにしてくれて、モジュールの依存関係もいい感じに処理してくれる機能です。

Active Supportについて

Active Supportは、Ruby言語の拡張、ユーティリティ、その他横断的な機能を提供するRialsのコンポーネントです。

Ruby on Railsアプリケーションでは、(config で読み込まない設定をしていない限り)基本的にすべてのActive Supportを読み込みます。

どんな時に使われるのか

主には、MVCをまたいで共通した処理を利用したい場合に用いられます。 例えば、Viewでも使いたいけど、Controllerでも使いたいメソッドがある場合、
Viewだけならhelperに書けば良いし、ControllerだけならApplicationControllerに書けば良いのですが、
どちらでも使いたい場合、共通のモジュールとしてConcernに定義することが考えられます。

具体例

ViewでもControllerでも使いたいhugaというメソッドがある時の一例です。
helper methodとして使えるようにしています。

Concern

app/controllers/concerns/hoge.rb

# Hogeというmoduleを定義
module Hoge
  # ActiveSupportのConcernを取り込む
  extend ActiveSupport::Concern
  
  # includedに渡したブロックがmoduleのinclude先で利用出来るようにする
  included do
    # helper_methodにhugaを渡す
    helper_method :huga
  end
  
  # hugaメソッドを定義
  def huga
    @huga_huga = xxxxxxxxxxxx
  end
end

Controller

app/controllers/xxxx_controller.rb

class ApplicationController < ActionController::Base
  # Hogeモジュールを取り込む
  include Hoge
end

View

app/views/xxxx/index_html.haml

%p "#{@huga_huga}さん"

最後に

色々な歴史があってActive Supportに追加されたので、調べてみると古いコード例などもあり、どう書けば良いものか悩みました。
Ruby on Rails 5.2.0にも、こういう風に書かないといけないのをこう出来るんだよ、という風に書いてあったのが後々なるほど、となったので、リンクを載せておきます。

api.rubyonrails.org

Kernel偉大という話

Kernelとは

Kernelとは、核心・要点・中心部という意味合いを持つ言葉です。

RubyのKernelは、module Kernel (Ruby 2.5.0)によると、

全てのクラスから参照できるメソッドを定義しているモジュール。

です。

どういう意味?

まず、大事なこと。Kernelモジュールは、モジュールです(そのまんまですみません)。

『全てのクラスから参照できるメソッド』と言うのは、ObjectがKernelモジュールをincludeしていると言うことなのです。

下記の例で言うと、

a = "Hello!!"
a.class
=> String
a.class.sperclass
=> Object

aのクラスはStringです。
StringのスーパークラスがObjectです。
このObjectがKernelモジュールをincludeしているので、aがKernelモジュールを参照できます。

そして、Objectはすべてのクラスのスーパークラスです。
ObjectがKernelモジュールをincludeしているということは、Kernelモジューを『全てのクラスから参照できる』ということになるのです。

どんなのがあるの?

よく見かけるので、Array, Hash, Intege, binding, exit, raise, load, open, p, print, require, select...
書きかけましたが、キリがないので、詳細はこちらのドキュメントからどうぞ。

docs.ruby-lang.org

最後に

よくわからない感じになっていたのですが、先輩に手伝っていただき図に書いたりしながらやっとイメージがついたので要点をまとめました。 Kernel偉大…!