[:contens]
ジョギング
- 香椎浜 x 2 周
- 左ひざの内側の違和感が痛みに変わる
- 明日は休養
日課
- (腕立て x 50 + 腹筋 x 30) x 3
夕飯
- 奥さんが遅かったので「串かつもりす」にて
今日のるびぃ ~ Ruby技術者認定試験【Gold】模擬問題を解いてみる (13) ~
Q.56 メソッドの定義
以下の実行結果を出力するコードとして__(1)__にあてはまるものを選択してください.
# コード class Log [:debug, :info, :notice].each do |level| __(1)__(level) do @state = level end attr_reader :state end log = Log.new log.debug ; p log.state log.info ; p log.state log.notice ; p log.state # 実行結果 :debug :info :notice
以下, 解答.
define_method
以下, 解説より抜粋.
- Modume#define_method メソッドは引数で指定した名前のメソッドを定義するメソッド
- 名前は String 又は Symbol で指定する
以下, 実行例.
[11] pry(main)> class Log [11] pry(main)* [:debug, :info, :notice].each do |level| [11] pry(main)* define_method(level) do [11] pry(main)* @state = level [11] pry(main)* end [11] pry(main)* attr_reader :state [11] pry(main)* end [11] pry(main)* end => [:debug, :info, :notice] [12] pry(main)> log = Log.new => #<Log:0x000055a62046b1c8> [13] pry(main)> log.debug => :debug [14] pry(main)> log.info => :info [15] pry(main)> log.notice => :notice [16] pry(main)> log.state => :notice [17] pry(main)> log.debug => :debug [18] pry(main)> log.state => :debug [19] pry(main)> log.info => :info [20] pry(main)> log.state => :info
Q.57 Proc クラス
以下のコードを実行したときの出力結果として正しいものを選択してください.
# コード var = lambda { puts "hello" } p var.class
以下, 解答.
Proc
以下, 解説より抜粋.
- lambda キーワードは Proc オブジェクトを生成するためのキーワード
- Kernel.#lambda は与えられたブロックから手続きオブジェクト (Proc のインスタンス) を生成して返す (ドキュメントより抜粋)
以下, 実行例.
[21] pry(main)> var = lambda { puts "hello" } => #<Proc:0x000055a62077e838@(pry):28 (lambda)> [22] pry(main)> var.class => Proc [23] pry(main)> var.lambda? => true [24] pry(main)> var = Proc.new { puts "hello" } => #<Proc:0x000055a6203659e0@(pry):31> [25] pry(main)> var.class => Proc [26] pry(main)> var.lambda? => false
Q.58 特異メソッドの定義
以下のコードの説明として正しいものを選択してください.
# コード 01: module M 02: def foo 03: puts "foo" 04: end 05: end 06: 07: class Foo 08: extend M 09: end 10: 11: Foo.new.foo
以下, 解答.
11 行目で例外 (NoMethodError) が発生する
以下, 解説より抜粋.
- Object#extend はモジュールで定義したメソッドをクラスメソッド (特異メソッド) として追加する
- メソッドを呼び出す場合は
Foo.foo
と記述する必要がある
以下, 実行例.
[1] pry(main)> module M [1] pry(main)* def foo [1] pry(main)* puts "foo" [1] pry(main)* end [1] pry(main)* end => :foo [2] pry(main)> [3] pry(main)> class Foo [3] pry(main)* extend M [3] pry(main)* end => Foo [4] pry(main)> Foo.new.foo NoMethodError: undefined method `foo' for #<Foo:0x00005634afc36f10> from (pry):9:in `__pry__' [5] pry(main)> Foo.foo foo => nil
ふむふむ.