🏅

Ruby Gold備忘録

2023/12/17に公開

はじめに

株式会社ウェイブCoolmicのエンジニアをしている布施です。
Coolmicは日本のコミックを海外向けに配信するWEBサービスです。

株式会社ウェイブには社員の成長を支援するための制度の一つとして、資格試験の受験費用負担があります。
今回、サービスで使用するRubyの理解を深めるため、この制度を利用してRuby技術者認定試験(Ruby Association Certified Ruby Programmer Gold version 3)を受験し、無事合格しました。
出題内容を覚えているうちに書き残しておこうと思います。スピード勝負!
読者の方々の勉強の役に立てばうれしいです。
順番がハチャメチャですがご了承ください。やる気が出たら整理するかもしれません。

この辺の内容を押さえておこう

  • define_method, instance_method
    • define_method: インスタンスメソッドを定義する。
    • instance_method: selfのインスタンスメソッドを返す。UnboundMethodとして返すので呼び出すためにはbindが必要。
  • eval, class_eval, module_eval, instance_eval
    • eval: 文字列をRubyプログラムとして実行する。
    • class_eval(=module_eval): クラス(モジュール)のコンテキストで文字列またはブロックを評価する。文字列が渡された場合、スコープはクラス。ブロックが渡された場合、スコープはクラスの外側。
    • instance_eval: オブジェクトのコンテキストで文字列またはブロックを評価する。メソッドを定義すればそのオブジェクトの特異メソッドになる。
  • send, __send__, public_send, private_send
    • send(=__send__): オブジェクトのメソッドを呼ぶ。privateメソッドも呼べる。
    • public_send: publicメソッドのみ呼べる。
    • private_send: そんなもんはねえ。
  • const_missing
    • const_missingはObjectのクラスメソッド。クラスメソッドとしてオーバーライドしなければならない。
  • const_get
    • モジュールに定義されている定数を取り出す。完全修飾名を指定すると、モジュール内やinclude内に定義されていない定数も取り出せる。
  • singleton_class
    • hoge.singleton_classでhogeの特異クラスを返す。
  • ヒアドキュメント
    • <<EOS: 終点のEOSまでの内容がそのまま反映される。終点のEOSにインデントがついていると、文字列に含まれる。
    • <<-EOS: 終点のEOSのインデントが文字列に含まれないので、ネスト内で記述するときに見やすくできる。本文内のインデントは含む。.gsub()でインデントを削除する選択肢がある問題が出題された。
    • <<~EOS: 終点のEOSと本文内のインデントをカットしてくれるので、ネスト内で記述するときに見やすくできる。
  • begin, rescue, else, ensure
    • rescueに型の指定がない場合、StandardErrorとそのサブクラスをキャッチする。
    • exit(SystemExit)をrescueしたあとのensureは実行される。システム終了しない。
    • ensureは評価されても返り値にならない。
  • lambda, ->(アロー), Proc
    • 以下は同じ。
      • lambda { |num| (x + y) * num }
      • ->(num) { (x + y) * num }
    • lambdaは引数が足りないとエラー、procはnilで埋める。(参考
  • 転送引数...
    • 引数をそのまま流す
  • inspect, to_s, to_str
    • inspect: pで呼ばれる。人間が読みやすい形式の文字列。
    • to_s: print, putsで呼ばれる。オブジェクトの文字列表現。
    • to_str: 暗黙の型変換で呼ばれる。
  • include?, match?, =~, contains?
    • include?: 引数の文字列が含まれているかどうかを判定する。
    • match?, =~: 正規表現のマッチングを行う。
    • contains?: そんなもんはねえ。
  • 正規表現の最小量指定子
    • デフォルトでは、マッチが成功する最長の文字列にマッチしようとするが、最小量指定子が使用されると、最短の文字列にマッチしようとする。
    • /(B.bbidi-)+?/.match("Bibbidi-Bobbidi-Boo")みたいな感じで出題されていた。
  • 多重代入
    • x, y = [1,2,3]これは
      x = 1, y = 2こうなる。
  • メソッドの可変長引数
    • デフォルト値不可(参考
    • 値が無ければ空配列(参考
  • 配列のfreeze, <<
    • <<は配列の末尾に破壊的に要素を追加するため、配列がfreezeされているとエラーになる。
    • +=による要素の追加は別オブジェクトになるからOK。
  • 配列の要素の個数
    • tally: {arrayのvalue: 個数}Hashが返る。
    • こういう選択肢もあった。
      irb(main):001:0> a=[1,2,3,1,2,3,3,2,1,1,3,3]
      => [1, 2, 3, 1, 2, 3, 3, 2, 1, 1, 3, 3]
      irb(main):002:0> a.sort.chunk{|n| n}.to_h{|key, value| [key, value.length]}
      => {1=>4, 2=>3, 3=>5}
      
  • Hash#dig
    • ネストしたHashの値を参照する。
    • digと同じ処理をする記述をもう1つ選ぶ問題があった。
      hash[](:hoge)みたいな選択肢があったけどよく分からない。
  • Rational
    • 数字にrをつけて定義する。(参考
    • DateTime, DateRational
    • TimeFloat
  • Time#iso8601
    • 2008-08-31T03:34:56Zの形式。
  • Numbered Parameters
    • 暗黙的にブロックの引数を参照する。_1から始まる。
  • attr_accessor
    • シンボルを渡す。複数定義するならカンマで区切る。
  • Module
    • Module.class == Class
    • Module.new.class == Module
  • protected
    • 他のインスタンスでも同じクラスやサブクラスであれば呼び出せる。(参考
  • case/whenの演算子
    • ===
  • if __FILE__ == $0
    • 現在実行中の Ruby スクリプトの名前を表す文字列です。
    • rubyが0じゃないのか~
  • instance_variable_get
    • 引数は"@hoge"とか:@hogeとか。
    • シンボルでも@つけるのか~
  • Forwardable#def_delegator
    • どんな問題だったか忘れた。
  • Class.superclass == Module
    • Class, Objectとかの継承関係は覚えておこう!
  • refine
    • refineしたインスタンスメソッドでも別のインスタンスメソッドから呼ぶと、リファインメント前の処理が実行される。(参考
  • クラスインスタンス変数と特異クラスの関係
    • クラスインスタンス変数(見た目は@hoge)はクラスメソッドからアクセスできる。(参考
  • クラス変数(@@hoge
    • サブクラスから参照/代入が可能。
    • 特異クラス内で定義したとしてもレキシカルに探索される、みたいなことをどこかで見た気がする(RExの問題?)けど思い出せない。
      • ↑無視してください。

最後に

いろいろと書き殴ってきましたが、RExなどで出題形式に慣れるのと、先駆者たちのブログを読んで勉強するのが大事だと思います!
あと、受験当日は時間に余裕を持って移動しましょう!

参考

宣伝

株式会社ウェイブでは、電子コミックやアニメ配信サービスなどを自社開発で運営しております。
新しい技術を積極的に取り入れているモダンな環境が整っているウェイブで一緒に働いてみませんか?
成長支援制度として、資格試験費用負担のほかにも学習用書籍やUdemy等の動画学習サービスの費用負担などもあります!
興味ある方は是非こちらをご覧ください!

https://recruit.wwwave.jp/

wwwave's Techblog

Discussion