ようへいの日々精進XP

よかろうもん

2018 年 03 月 14 日(水)

[: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

ふむふむ.