ようへいの日々精進XP

よかろうもん

2018 年 07 月 22 日 (日)

ジョギング

  • 香椎浜 x 3 周
  • 今日は朝の 8 時前から走り始めた
  • いい感じで涼しくて走り易かった

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

奥さんとカラオケデート

奥さんのヴォーカルレッスンに付き合っている。

  • 香椎のジャンカラに朝 10 時前から並んで奥さんとカラオケデート
  • 奥さんはボーカルのトレーニングに通っていたりしたので, 贔屓目に見てもウマイと思っているし, 自分もカラオケは好きなので奥さんとの共通の趣味的なものが出来てうれしい
  • 最近のカラオケマシンはすごく進化していて, 歌っている様子を録画してインターネットと共有出来たりするのに驚きながら二時間程ワイワイしてとても楽しかった

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (12) 文法 (2) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

文法 (5)

Q11. 以下の実行結果になるように, [ x ] と [ y ] に記述する適切なコードを選べ.

# コード
while [ x ].gets
puts $_ if $_ =~ /Ruby/
end
[ y ]
java programming
Ruby programming
C programming

# 実行結果
Ruby programming

以下, 解答.

  1. [ x ] = DATA, [ y ] = __END__

以下, スクリプトによる確認.

$ cat q10.rb 
while DATA.gets
puts $_ if $_ =~ /Ruby/
end
__END__
java programming
Ruby programming
C programming
$ ruby q10.rb 
Ruby programming

以下, 解説より抜粋.

  • __END__ 以降に記述した内容は, File オブジェクト DATA から読み出すことが出来る

以下, ドキュメントより抜粋.

  • constant Object::DATA
  • スクリプトの __END__ プログラムの終り以降をアクセスする File オブジェクト
  • ソースファイルの __END__ 以降は解析, 実行の対象にならないので, その部分にプログラムが利用するためのデータを書き込んでおくことができる
$ cat q10-1.rb
p DATA.gets
p DATA.gets
p DATA.gets
__END__
foo
bar
baz
$ ruby q10-1.rb
"foo\n"
"bar\n"
"baz\n"

文法 (6)

Q12. 以下の実行結果になるように, [ x ] に記述する適切なコードを選べ.

# コード
def method
  puts 'Hello, World'
end

[ x ]

def method
  old_method
  puts 'Hello, Ruby World'
end

method

# 実行結果
Hello, World
Hello, Ruby World

以下, 解答.

  1. alias old_method method

以下, irb による確認.

irb(main):001:0> def method
irb(main):002:1>   puts 'Hello, World'
irb(main):003:1> end
=> :method
irb(main):004:0> 
irb(main):005:0* alias old_method method
=> nil
irb(main):006:0> 
irb(main):007:0* def method
irb(main):008:1>   old_method
irb(main):009:1>   puts 'Hello, Ruby World'
irb(main):010:1> end
=> :method
irb(main):011:0> 
irb(main):012:0* method
Hello, World
Hello, Ruby World
=> nil

以下, 解説より抜粋.

  • alias は, 第一引数に新しいメソッド名, 第二引数に旧メソッド名を指定する
  • メソッド名は, 識別子かシンボルで記述する (文字列では記述出来ない)
# シンボル指定
irb(main):001:0> def method
irb(main):002:1>   puts 'Hello, World'
irb(main):003:1> end
=> :method
irb(main):004:0> 
irb(main):005:0* alias :old_method :method
=> nil
irb(main):006:0> 
irb(main):007:0* def method
irb(main):008:1>   old_method
irb(main):009:1>   puts 'Hello, Ruby World'
irb(main):010:1> end
=> :method
irb(main):011:0> 
irb(main):012:0* method
Hello, World
Hello, Ruby World
=> nil

# シンボルと識別子のハイブリッド
irb(main):013:0> def method
irb(main):014:1>   puts 'Hello, World'
irb(main):015:1> end
=> :method
irb(main):016:0> 
irb(main):017:0* alias :old_method method
=> nil
irb(main):018:0> 
irb(main):019:0* def method
irb(main):020:1>   old_method
irb(main):021:1>   puts 'Hello, Ruby World'
irb(main):022:1> end
=> :method
irb(main):023:0> 
irb(main):024:0* method
Hello, World
Hello, Ruby World
=> nil

文法 (7)

Q18. 以下のコードと同じ実行結果になるコードはどれか.

# コード
a, b = [1, 2]

以下, 解答.

  1. a = 1 b = 2

以下, irb にて確認.

irb(main):001:0> a, b = [1, 2]
=> [1, 2]
irb(main):002:0> p a
1
=> 1
irb(main):003:0> p b
2
=> 2

以下, 解説より抜粋.

  • 配列の多重代入
  • 左辺には, 右辺の同じ位置にある値が代入される

フムフム.

2018 年 07 月 21 日 (土)

ジョギング

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

豚汁

  • 奥さんお手製のお味噌で豚汁
  • うまかった!

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (11) 文法 (1) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

文法 (1)

Q1. 以下のコードを実行するとどうなるか.

[1, 2, 3].each do |i|
  num = i
end

puts num

以下, 解答.

  1. 例外発生

以下, irb にて確認.

irb(main):001:0> [1, 2, 3].each do |i|
irb(main):002:1*   num = i
irb(main):003:1> end
=> [1, 2, 3]
irb(main):004:0> 
irb(main):005:0* puts num
NameError: undefined local variable or method `num' for main:Object

以下, 解説より抜粋.

  • each ブロック内で宣言した変数は, ブロック外で無効となる
  • 無効となる為, 例外 (NameError) が発生する

文法 (2)

Q4. 以下のコードを実行するとどうなるか.

ary = Array.new(3, 'a')
ary[0].next!
p ary

以下, 解答.

  1. ["b", "b", "b"] と表示

以下, irb にて確認.

irb(main):001:0> ary = Array.new(3, 'a')
=> ["a", "a", "a"]
irb(main):002:0> ary[0].next!
=> "b"
irb(main):003:0> p ary
["b", "b", "b"]
=> ["b", "b", "b"]

以下, 解説より抜粋.

  • Array.new(3, 'a') は, サイズ 3 の配列を生成し, 文字列オブジェクト "a" を全ての要素に設定する
  • 文字列オブジェクト "a" は全て同一のオブジェクトになり, 配列の要素は, すべて同一の文字列オブジェクト "a" を参照する
  • その為, 1 つの要素を変更すると, すべての要素が変更される

文法 (3)

Q7. 以下のコードで, case 文の比較に使用されている演算子はどれか.

a = [1, 'Hello', false]
a.each do |x|
  puts case x
  when String then 'string'
  when Numeric then 'number'
  when TrueClass, FalseClass then 'boolean'
  end
end

以下, 解答.


以下, irb にて確認.

irb(main):001:0> a = [1, 'Hello', false]
=> [1, "Hello", false]
irb(main):002:0> a.each do |x|
irb(main):003:1*   puts case x
irb(main):004:2>   when String then 'string'
irb(main):005:2>   when Numeric then 'number'
irb(main):006:2>   when TrueClass, FalseClass then 'boolean'
irb(main):007:2>   end
irb(main):008:1> end
number
string
boolean
=> [1, "Hello", false]

以下, 解説より抜粋.

  • case 文の比較には, === を利用する

文法 (4)

Q10. 4 行目で生成 (raise) される例外オブジェクトのクラスは何ですか.

begin
  'cat'.narrow
rescue NameError
  raise
end

以下, 解答.

  1. NoMethodError

以下, irb にて確認.

irb(main):001:0> begin
irb(main):002:1*   'cat'.narrow
irb(main):003:1> rescue NameError
irb(main):004:1>   raise
irb(main):005:1> end
NoMethodError: undefined method `narrow' for "cat":String
...

以下, 解説より抜粋.

  • rescue 節の raise は, rescue 節が処理中の例外オブジェクトを再生成する
  • オブジェクトに存在しないメソッドを実行した場合, NoMethodError オブジェクトが発生する
  • 出題コードの 2 行目で NoMethodError オブジェクトが発生するので, 3 行目以降の rescue 節でキャッチした NoMethodError オブジェクトが raise される

2018 年 07 月 20 日 (金) 〜 Ruby 認定技術者試験がまた不合格だったけど, #fukuokarb 100 回目に参加して心が救われた感 〜

ジョギング

  • お休み

日課

  • お休み

Ruby 技術者認定試験 Gold

  • 落ちた
  • めちゃくちゃ悔しい...

不合格が判った瞬間は「なんで?」って思ったけど, 冷静になって最後まで悩んだ問題とかを見直してみたら, いい感じで間違っていたので妥当な結果だったのかもしれない.

ランチ

  • 試験に落ちて傷心状態で奥さんと博多ランチ
  • 寿司を食べたのだけど, あまりの切なさに味わうことが出来なかった...

Fukuoka.rb #100

fukuokarb.connpass.com

最近, 参加している Fukuoka.rb が, なんと 100 回を迎えるとのことで, 祝い宴に便乗して今日の不合格の話を LT で喋った. 自分を含めて 10 名くらいの rubyist の皆さんが Ruby に対する熱い想いを語っていて, 皆さん, 本当に Ruby が好きで, そこで出会う人たちとの縁とかそういうものも含めて大切にされているんだなーと感じた. その中でも, 福岡に縁のある rubyist の一人である @hmsk さんのサンフランシスコからのビデオレターがとても良かった.

ということで, これからも fukuoka.rb にじゃんじゃん参加して, ゆるっと楽しみながら Ruby 力を上げられればなあと考えている.

企画, 運営スタッフの皆さん, 本当にありがとうございました. 今後共宜しくお願いしまっす.

今日のるびぃ

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (10) 組み込みライブラリ (3) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

組み込みライブラリ (7)

Q27. 以下の実行結果になるように, [ x ] に記述する適切なコードを選べ.

# コード
/(\d+)/ =~ 'abcd12efgh'
puts [ x ]

# 実行結果
12

以下, 解答.

  1. $1

以下, irb にて確認.

irb(main):001:0> /(\d+)/ =~ 'abcd12efgh'
=> 4
irb(main):002:0> puts $1
12
=> nil

以下, 解説より抜粋.

ちなみに, $0 は以下の通り, irb (実行されるコードのファイル名) となる.

irb(main):003:0> puts $0
irb

組み込みライブラリ (8)

Q19. 以下の実行結果になるように, [ x ] に記述する適切なコードを全て選べ.

# コード
x = ['abc', 'defgk', 'lopq']
p x.sort{|a, b| [ x ]}

# 実行結果
['abc', 'lopq', 'defgk']

以下, 解答.

  1. a.size <=> b.size
  2. a.size - b.size

以下, irb による確認.

irb(main):001:0> x = ['abc', 'defgk', 'lopq']
=> ["abc", "defgk", "lopq"]
irb(main):002:0> p x.sort{|a, b| a.size <=> b.size}
["abc", "lopq", "defgk"]
=> ["abc", "lopq", "defgk"]
irb(main):003:0> x = ['abc', 'defgk', 'lopq']
=> ["abc", "defgk", "lopq"]
irb(main):004:0> p x.sort{|a, b| a.size - b.size}
["abc", "lopq", "defgk"]
=> ["abc", "lopq", "defgk"]

以下, 解説より抜粋.

ちなみに, 他の選択肢の場合.

irb(main):006:0> p x.sort{|a, b| b.size <=> a.size}
["defgk", "lopq", "abc"]
=> ["defgk", "lopq", "abc"]
irb(main):007:0> p x.sort{|a, b| b.size - a.size}
["defgk", "lopq", "abc"]
=> ["defgk", "lopq", "abc"]
irb(main):008:0> p x.sort{|a, b| a <=> b}
["abc", "defgk", "lopq"]
=> ["abc", "defgk", "lopq"]
irb(main):009:0> p x.sort{|a, b| b <=> a}
["lopq", "defgk", "abc"]
=> ["lopq", "defgk", "abc"]

組み込みライブラリ (9)

Q6. [ x ] に記述する適切なコードを全て選べ.

Thread.[ x ] do
end

以下, 解答.

  1. start
  2. new
  3. fork

以下, 解説より抜粋.

  • Thread クラスで, スレッドを生成し実行するメソッドは以下の通り
    • start
    • new
    • fork

以下, irb による確認.

irb(main):010:0> Thread.start do; end
=> #<Thread:0x00563865b96330 run>
irb(main):011:0> Thread.new do; end
=> #<Thread:0x00563865b8df78 dead>
irb(main):012:0> Thread.fork do; end
=> #<Thread:0x00563865b89bf8 run>

フムフム.

2018 年 07 月 19 日 (木)

ジョギング

  • 香椎浜 x 2 周
  • 終業後, 涼しい時間帯で走った
  • キツかった...

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

明日は

  • Ruby 技術者認定試験 Gold を受験する
  • 三浪したくないので, 絶対合格するぞ

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (9) 組み込みライブラリ (2) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

組み込みライブラリ (5)

Q43. Kernel モジュールの freeze メソッドについて適切な記述を全て選べ.

以下, 選択肢.

  1. clonefreeze, taint, 特異メソッド等の情報も含めた完全な複製を作成する
  2. dupfreeze, taint, 特異メソッド等の情報も含めた完全な複製を作成する
  3. クラスだけでなくモジュールも freeze 可能である
  4. モジュールをインクルードしたクラスを freeze することは出来ない

以下, 解答.

  1. clonefreeze, taint, 特異メソッド等の情報も含めた完全な複製を作成する
  2. クラスだけでなくモジュールも freeze 可能である

以下, 解説より抜粋.

  • clonedup は, いずれもオブジェクトを複製する
  • clonefreeze, 特異メソッド等の情報を含めた完全な複製を返す
  • dup は, オブジェクト及び taint 情報を含めた複製を返す
  • モジュールは freeze 可能
  • モジュールをインクルードしたクラスも freeze 可能

Object#clone と Object#dup について (ドキュメントより引用)

  • オブジェクトの複製を作成する
  • dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成する
  • clone や dup は浅い (shallow) コピーである
  • TrueClass, FalseClass, NilClass, Symbol, そして Numeric クラスのインスタンスなど一部のオブジェクトを複製しようとすると TypeError が発生する

以下, irb による確認.

irb(main):001:0> obj = "string"
=> "string"
irb(main):002:0> obj.taint
=> "string"
irb(main):003:0> def obj.fuga
irb(main):004:1> end
=> :fuga

# オブジェクトを freeze
irb(main):005:0> obj.freeze
=> "string"
irb(main):006:0> p(obj.equal?(obj))
true
=> true
irb(main):007:0> p(obj == obj)
true
=> true
irb(main):008:0> p(obj.tainted?)
true
=> true
irb(main):009:0> p(obj.frozen?)
true
=> true
irb(main):010:0> p(obj.respond_to?(:fuga))
true
=> true

# オブジェクトを clone
irb(main):011:0> obj_c = obj.clone
=> "string"
irb(main):012:0> 
# オブジェクト ID は異なる
irb(main):013:0* p(obj.equal?(obj_c))
false
=> false
irb(main):014:0> p(obj == obj_c)
true
=> true
irb(main):015:0> p(obj_c.tainted?)
true
=> true
irb(main):016:0> p(obj_c.frozen?)
true
=> true
irb(main):017:0> p(obj_c.respond_to?(:fuga))
true
=> true

# オブジェクトを dup
irb(main):018:0> obj_d = obj.dup
=> "string"
irb(main):019:0> 
# オブジェクト ID は異なる
irb(main):020:0* p(obj.equal?(obj_d))
false
=> false
irb(main):021:0> p(obj == obj_d)
true
=> true
irb(main):022:0> p(obj_d.tainted?)
true
=> true
irb(main):023:0> p(obj_d.frozen?)
false
=> false
# dup は特異メソッドはコピーしない
irb(main):024:0> p(obj_d.respond_to?(:fuga))
false
=> false

組み込みライブラリ (6)

Q42. 以下のコードを実行したとき, 正しい出力結果を選べ.

f = Fiber.new {
  print 'A'
  Fiber.yield 'B'
  print 'C'
}

print 'D'
print f.resume
print 'E'

以下, 解答.

  1. DABE

以下, irb にて確認.

irb(main):001:0> f = Fiber.new {
irb(main):002:1*   print 'A'
irb(main):003:1>   Fiber.yield 'B'
irb(main):004:1>   print 'C'
irb(main):005:1> }
=> #<Fiber:0x00564d6dc775e8>
irb(main):006:0> 
irb(main):007:0* print 'D'
D=> nil
irb(main):008:0> print f.resume
AB=> nil
irb(main):009:0> print 'E'
E=> nil

以下, 解説より抜粋.

  • Fiber のブロック内は f.resume が呼び出された時に評価され, Fiber.yield まで実行する
  • Fiber.yield が呼ばれると, 引数の B と共にコンテキストに処理を戻す
  • 再び f.resume が呼ばれると Fiber.yield の次の行から実行するが, 設問では f.resume を 1 回しか呼んでいない為, print 'C' は実行されない

追加で, f.resume を実行する.

...
irb(main):010:0> print f.resume
C=> nil

フムフム.

2018 年 07 月 18 日 (水)

ジョギング

  • 香椎浜 x 2 周
  • 終業後, 涼しい時間帯で走った
  • 涼しいのでいい感じではしれた気がする

日課

  • お休み
  • 時間の使い方を工夫せねば

ギョーム

  • 勝手に師匠と呼んでいるもりけんさんに色々と教えてもらいながら, 実装を追加したり, ユニットテストを追加したり
  • 識者の皆さんにとっては, 些細なことなのかもしれないけど, 自分にとってはすごく勉強になったし, もっと努力せねばと思った次第

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (8) 組み込みライブラリ (1) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

組み込みライブラリ (1)

Q50. 以下のコードを実行するとどうなるか. 全て選べ.

t1 = Thread.start do
  raise ThreadError
end

loop {
    n = rand(0..3)
    puts n
    if n == 0
        break
    end
}

以下, 解答.

  1. 例外が発生するが, メッセージを出力せずに停止状態になる
  2. -d オプションを付けた場合, 例外発生のメッセージを出力して終了する

以下, スクリプトで確認.

# 例外が発生したスレッドだけが警告無しで終了して, 以後の処理は継続される
$ ruby thread_exception.rb 
2
0

以下, -d オプションを付与して実行.

# 何れかのスレッドで例外が発生した時点でインタプリタ全体が中断する
$ ruby -d thread_exception.rb 
... 略
Exception `ThreadError' at thread_exception.rb:2 - ThreadError
Exception `ThreadError' at thread_exception.rb:5 - ThreadError
thread_exception.rb:2:in `block in <main>': ThreadError (ThreadError)

以下, 解説より抜粋.

  • マルチスレッドで例外が発生し, 例外が rescue で処理されなかった場合, 例外が発生したスレッドだけが警告無しで終了し, 他のスレッドは実行を続ける
  • -d オプションを付けるとデバッグモードでの実行となり, 何れかのスレッドで例外が発生した時点でインタプリタ全体が中断する

組み込みライブラリ (2)

Q49. Kernel モジュールの loadrequire について, 適切な記述を選べ.

以下, 選択肢.

  1. load はバイナリエクステンションもロード出来る
  2. load は拡張子無しのライブラリ名を渡す
  3. require は同じファイルを複数回ロードすることを防ごうとする
  4. require はバイナリエクステンションはロード出来ない

以下, 解答.

  1. require は同じファイルを複数回ロードすることを防ごうとする

以下, 解説より抜粋.

  • load は同じライブラリを複数回ロードする
  • require は同じファイルを一度だけロードする
  • load はバイナリエクステンションはロード出来ない
  • require はバイナリエクステンションもロードし, .rb.so 等の拡張子も補完する

組み込みライブラリ (3)

Q47. オブジェクトのマーシャリングについて, 適切な記述を全て選べ

以下, 選択肢.

  1. IO クラスのオブジェクトはマーシャリング出来ない
  2. 特異メソッドを持つオブジェクトはマーシャリング出来ない
  3. ユーザーが作成したオブジェクトはマーシャリング出来ない
  4. 無名クラスやモジュールはマーシャリング出来ない

以下, 解答.

  1. IO クラスのオブジェクトはマーシャリング出来ない
  2. 特異メソッドを持つオブジェクトはマーシャリング出来ない
  3. 無名クラスやモジュールはマーシャリング出来ない

以下, 解説より抜粋.

  • マーシャリング = オブジェクトを文字列として書き出す
  • システムの状態を保持するオブジェクト (IO, File, Dir, Socket) や特異メソッドを定義したオブジェクトはマーシャリング不可
  • 無名のクラスやモジュールもマーシャリング不可

以下, マーシャリングの例.

irb(main):002:0>  Marshal.dump('aaa')
=> "\x04\bI\"\baaa\x06:\x06ET"
irb(main):003:0> Marshal.load("\x04\bI\"\baaa\x06:\x06ET")
=> "aaa"

組み込みライブラリ (4)

Q45. Kernel モジュールの clone メソッドについて, 適切な記述を全て選べ.

  1. freeze, 特異メソッド等の情報を含めてコピーする
  2. freeze, 特異メソッド等の情報を含めてコピーしない
  3. 参照先のオブジェクトもコピーされる
  4. 参照先のオブジェクトはコピーされない

以下, 解答.

  1. freeze, 特異メソッド等の情報を含めてコピーする
  2. 参照先のオブジェクトはコピーされない

以下, 解説より抜粋.

  • Kernel#clonefreeze, taint, 特異メソッド等の情報を含めた完全なコピーを作成する
  • 参照先のオブジェクトはコピーしない (シャローコピー)

フムフム.

2018 年 07 月 17 日 (火)

ジョギング

  • 香椎浜 x 2 周
  • 昨晩走った疲労が抜けていない感じと暑さでバテバテだった

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

夕飯

  • 冷製パスタを作る
  • 冷製といっても茹でたパスタを水でしめてからオリーブオイルで似たベーコンやトマト等を掛けるだけなんだけど, 手軽でそこそこ美味しい

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (7) オブジェクト指向系問題 (6) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

オブジェクト指向 (16)

以下のコードを実行するとどうなるか.

module Mod
  def Mod.foo
    puts 'Mod'
  end
end

class Cls1
  include Mod
  def Cls1.foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  def Cls2.foo
    puts 'Cls2'
  end
end

Cls2.new.foo

以下, 解答.

  1. 例外発生 (NoMethodError が発生)

以下, irb にて確認.

irb(main):001:0> module Mod
irb(main):002:1>   def Mod.foo
irb(main):003:2>     puts 'Mod'
irb(main):004:2>   end
irb(main):005:1> end
=> :foo
irb(main):006:0> 
irb(main):007:0* class Cls1
irb(main):008:1>   include Mod
irb(main):009:1>   def Cls1.foo
irb(main):010:2>     puts 'Cls1'
irb(main):011:2>   end
irb(main):012:1> end
=> :foo
irb(main):013:0> 
irb(main):014:0* class Cls2 < Cls1
irb(main):015:1>   def Cls2.foo
irb(main):016:2>     puts 'Cls2'
irb(main):017:2>   end
irb(main):018:1> end
=> :foo
irb(main):019:0> 
irb(main):020:0* Cls2.new.foo
NoMethodError: undefined method `foo' for #<Cls2:0x00556c0c2f35c8>
...

以下, 解説より抜粋.

  • Cls2, Cls1, Mod の foo メソッドは, 何れもクラスメソッドとして定義している
  • Cls2.new.foo で呼び出している foo メソッドはインスタンスメソッドである為, 例外 NoMethodError が発生する

オブジェクト指向 (17)

以下のコードを実行すると何が表示されるか.

class A
  @@a = 0
  def initialize
    @@a = @@a + 1
  end
  
  def A.a
    @@a
  end
end

class B < A
end

A.new
A.new
B.new
B.new
p A.a

以下, 解答.

  1. 4 が出力される

以下, irb にて確認.

irb(main):001:0> class A
irb(main):002:1>   @@a = 0
irb(main):003:1>   def initialize
irb(main):004:2>     @@a = @@a + 1
irb(main):005:2>   end
irb(main):006:1>   
irb(main):007:1*   def A.a
irb(main):008:2>     @@a
irb(main):009:2>   end
irb(main):010:1> end
=> :a
irb(main):011:0> 
irb(main):012:0* class B < A
irb(main):013:1> end
=> nil
irb(main):014:0> 
irb(main):015:0* A.new
=> #<A:0x0055d9cb989f18>
irb(main):016:0> A.new
=> #<A:0x0055d9cb97fb30>
irb(main):017:0> B.new
=> #<B:0x0055d9cb97d4c0>
irb(main):018:0> B.new
=> #<B:0x0055d9cb972ae8>
irb(main):019:0> p A.a
4
=> 4

以下, 解説より抜粋.

  • クラス変数はスーパークラス, サブクラス間で共有される
  • クラス A の initialize は, A 及び B のインスタンス化により, 4 回呼びだされることになり @@a が 4 回更新される

フムフム.

2018 年 07 月 16 日 (月)

ジョギング

  • 夕方の涼しい時間帯で香椎浜 x 3 周
  • テンポよく走れた気がする

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

とんだ休日

  • 新宮の美味しいパン屋さんにドライブがてら出掛けたが定休日...
  • そして, 竹林亭に向かうも大行列... 30 分くらいで自宅に戻ってきた
  • 結局, 自宅ちかくのビストロでハンバーグランチを食べて休日は終わった
  • 暑い日は自宅でエアコン付けてのんびりする, 連休最終日は近場よりも自宅でゆっくり過ごすということを夫婦で再認識した

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (6) オブジェクト指向系問題 (5) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

オブジェクト指向 (13)

以下のコードを実行するとどうなるか. 全て選ぶ.

module Mod
  def foo
    puts 'Mod'
    super
  end
end

class Cls1
  def foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  prepend Mod
end

Cls2.new.foo

以下, 解答.

Mod と表示 Cls1 と表示

以下, irb にて確認.

irb(main):001:0> module Mod
irb(main):002:1>   def foo
irb(main):003:2>     puts 'Mod'
irb(main):004:2>     super
irb(main):005:2>   end
irb(main):006:1> end
=> :foo
irb(main):007:0> 
irb(main):008:0* class Cls1
irb(main):009:1>   def foo
irb(main):010:2>     puts 'Cls1'
irb(main):011:2>   end
irb(main):012:1> end
=> :foo
irb(main):013:0> 
irb(main):014:0* class Cls2 < Cls1
irb(main):015:1>   prepend Mod
irb(main):016:1> end
=> Cls2
irb(main):017:0> 
irb(main):018:0* Cls2.new.foo
Mod
Cls1
=> nil

以下, 解説より抜粋.

  • prepend で取り込まれたメソッドは, 元から定義されているメソッドよりも先に呼び出される
  • prepend で呼び出されたモジュール内で super を呼び出すと, スーパークラスの同名メソッドが呼び出される

オブジェクト指向 (14)

以下のコードを実行するとどうなるか.

module Mod
  def foo
    puts 'Mod'
  end
end

class Cls1
  def foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  include Mod
end

Cls2.new.foo

以下, 解答.

Mod と表示

  • include しているモジュールのメソッドは, スーパークラスのメソッドよりも優先して実行される

オブジェクト指向 (15)

以下の実行結果になるように, [ x ] に記述する適切なコードを全て選ぶ.

# コード
class Hoge
  [ x ]
end
Hoge.method1

# 実行結果
Hello, World.

以下, 解答.

# 解答 1
def self.method1
  puts 'Hello, World.'
end

# 解答 2
class << self
  def method1
    puts 'Hello, World.'
  end
end

以下, irb にて確認.

# 解答 1
irb(main):001:0> class Hoge
irb(main):002:1>   def self.method1
irb(main):003:2>     puts 'Hello, World.'
irb(main):004:2>   end
irb(main):005:1> end
=> :method1
irb(main):006:0> Hoge.method1
Hello, World.
=> nil
# 解答 2
irb(main):007:0> class Hoge
irb(main):008:1>   class << self
irb(main):009:2>     def method1
irb(main):010:3>       puts 'Hello, World.'
irb(main):011:3>     end
irb(main):012:2>   end
irb(main):013:1> end
=> :method1
irb(main):014:0> Hoge.method1
Hello, World.
=> nil

クラスメソッドの正しい定義方法.

# 定義方法 1
class Hoge
  def self.method1; end
end

# 定義方法 2
class Hoge
  class << self
    def method1; end
  end
end

フムフム.

2018 年 07 月 15 日 (日)

ジョギング

  • ゆるりと香椎浜 x 2 周
  • 暑さからか足の疲労感が半端ない

日課

  • 肩の周りに痛みがあったのでお休み

夕焼け

  • 奥さんと香椎浜
  • 缶ビールを片手に夕焼けを見たり, 馬鹿話で笑ったりした

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (5) オブジェクト指向系問題 (4) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

オブジェクト指向 (11)

以下のコードを実行するとどうなるか.

class Root
  def m
    puts 'Root'
  end
end

class A < Root
  def m
    puts 'A'
  end
end

class B < A
  def m
    puts 'A'
  end
  undef m
end

B.new.m

以下, 解答.

例外発生 (NoMethodError が発生する)

以下, irb にて確認.

irb(main):001:0> class Root
irb(main):002:1>   def m
irb(main):003:2>     puts 'Root'
irb(main):004:2>   end
irb(main):005:1> end
=> :m
irb(main):006:0> 
irb(main):007:0* class A < Root
irb(main):008:1>   def m
irb(main):009:2>     puts 'A'
irb(main):010:2>   end
irb(main):011:1> end
=> :m
irb(main):012:0> 
irb(main):013:0* class B < A
irb(main):014:1>   def m
irb(main):015:2>     puts 'A'
irb(main):016:2>   end
irb(main):017:1>   undef m
irb(main):018:1> end
=> nil
irb(main):019:0> 
irb(main):020:0* B.new.m
NoMethodError: undefined method `m' for #<B:0x00557fddf364e0>
...

以下, 解説より抜粋.

  • m メソッドは, B クラスで undef されているので定義が取り消されている
  • B.new.m を実行すると NoMethodError が発生する

オブジェクト指向 (12)

以下のコードを実行するとどうなるか.

module M1; end
module M2; end

class Cls1
  include M1
end

class Cls2 < Cls1
  def foo
    p self.ancestors
  end
  include M2
end

Cls2.new.foo

以下, 解答.

例外発生

以下, irb による確認.

irb(main):001:0> module M1; end
=> nil
irb(main):002:0> module M2; end
=> nil
irb(main):003:0> 
irb(main):004:0* class Cls1
irb(main):005:1>   include M1
irb(main):006:1> end
=> Cls1
irb(main):007:0> 
irb(main):008:0* class Cls2 < Cls1
irb(main):009:1>   def foo
irb(main):010:2>     p self.ancestors
irb(main):011:2>   end
irb(main):012:1>   include M2
irb(main):013:1> end
=> Cls2
irb(main):014:0> 
irb(main):015:0* Cls2.new.foo
NoMethodError: undefined method `ancestors' for #<Cls2:0x00564e49a66fd8>
...

以下, 解説より抜粋.

ちなみに, 以下のように書いても例外 (NameError) となる.

irb(main):016:0> class Cls2 < Cls1
irb(main):017:1>   def foo
irb(main):018:2>     p ancestors
irb(main):019:2>   end
irb(main):020:1> end
=> :foo
irb(main):021:0> Cls2.new.foo
NameError: undefined local variable or method `ancestors' for #<Cls2:0x00564e49a37990>

以下のように書くことで, ancestors の結果を得ることが出来る.

...
irb(main):022:0> class Cls2 < Cls1
irb(main):023:1>   def foo
irb(main):024:2>     p Cls2.ancestors
irb(main):025:2>   end
irb(main):026:1> end
=> :foo
irb(main):027:0> Cls2.new.foo
[Cls2, M2, Cls1, M1, Object, Kernel, BasicObject]
=> [Cls2, M2, Cls1, M1, Object, Kernel, BasicObject]

フムフム.

2018 年 07 月 14 日 (土)

ジョギング

  • ゆるりと香椎浜 x 2 周
  • 右半身と左半身のバランスが悪い感じは引き続き
  • 気温は高いけど, 海風が涼しく感じて走りにくさというのは感じなかった

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

かずきん, うきこ夫妻と暑気払い

  • 暑気払いにしては時期は早いかもしれないが, かずきん, うきこ夫妻と博多で一杯
  • 〆はいつものようにカラオケまでのスペシャルコースで楽しい時間を過ごすことが出来た

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (4) オブジェクト指向系問題 (3) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

オブジェクト指向 (9)

以下のコードと同じ意味のコードを選ぶ.

def foo
  puts 'Hello'
end

以下, 解答.

class Object
  private
  def foo
    puts 'Hello'
  end
end

以下, irb にて確認.

irb(main):001:0> def foo1
irb(main):002:1>   puts 'Hello'
irb(main):003:1> end
=> :foo1

foo1irb(main):004:0>
irb(main):005:0* foo1
Hello
=> nil
irb(main):006:0> class Object
irb(main):007:1>   private
irb(main):008:1>   def foo2
irb(main):009:2>     puts 'Hello'
irb(main):010:2>   end
irb(main):011:1> end
=> :foo2

foo2irb(main):012:0>
irb(main):013:0* foo2
Hello
=> nil

以下, 解説より抜粋.

  • トップレベルは Object クラスのオブジェクトとなる
  • トップレベルで定義されたメソッドの可視性は private である

ホントに private メソッドであるかを確認.

irb(main):001:0> def foo1; end
=> :foo1
irb(main):002:0> private_methods.grep(/foo/)
=> [:foo1]

ホンマヤ.

オブジェクト指向 (10)

B と出力するコードを選ぶ.

早速だけど, 以下, 解答.

# 解答 1
class Object
  def self.const_missing a
    p "#{a}"
  end
end
B

# 解答 2
class Hoge
  def self.const_missing a
    p "#{a}"
  end
end
B

以下, irb にて確認.

# 解答 1
irb(main):001:0> class Object
irb(main):002:1>   def self.const_missing a
irb(main):003:2>     p "#{a}"
irb(main):004:2>   end
irb(main):005:1> end
=> :const_missing
Birb(main):006:0> B
"B"
=> "B"

# 解答 2
irb(main):007:0> class Hoge
irb(main):008:1>   def self.const_missing a
irb(main):009:2>     p "#{a}"
irb(main):010:2>   end
irb(main):011:1> end
=> :const_missing
Birb(main):012:0> B
"B"
=> "B"

以下, 解説より抜粋.

  • const_missing はクラスに定数が定義されていない場合に呼び出されるメソッド
  • 呼び出している定数 B は, いずれもトップレベル (Object クラス) の定数 B を呼び出している

フムフム.

2018 年 07 月 13 日 (金)

ジョギング

  • お昼休みに
  • 香椎浜 x 2 周
  • 右足の太ももの前に痛み
  • 右半身と左半身のバランスが悪い感じ

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

暑かったけど

  • 夕方からは風が心地よい感じで, ずっと外で呑んでいたい気分になった

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (3) オブジェクト指向系問題 (2) ~

irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

オブジェクト指向 (7)

以下のコードを実行するとどうなるか.

module Mod
  def foo
    puts 'Mod'
  end
end

class Cls1
  def foo
    puts 'Cls1'
  end
end

class Cls2 < Cls1
  include Mod
  undef foo
end

Cls2.new.foo

以下, 解答.

  1. 例外発生

以下, irb

... 省略 ...
Cls2.new.fooirb(main):018:0>
irb(main):019:0* Cls2.new.foo
NoMethodError: undefined method `foo' for #<Cls2:0x007ffe538c53f8>

以下, 解説より抜粋.

  • Cls1 クラスで定義された foo は, Cls2 クラスで undef されているので foo の定義が取り消されている

ちなみに, undef しなかった場合には, 以下の通り Mod モジュールの foo メソッドが呼ばれる.

... 略 ...
irb(main):016:0> Cls2.new.foo
Mod
=> nil

オブジェクト指向 (8)

以下のコードを実行すると何が表示されるか, 尚, ファイル名は constant_1.rb とする.

class C1
  MSG = 'msg1'
  MSG2 = 'msg2'
  class Cls2
    MSG = 'C2.msg1'
    puts MSG
    puts MSG2
  end
  puts MSG
  puts MSG2
end

以下, 解答.

C2.msg1
msg2
msg1
msg2

以下, irb にて確認.

irb(main):001:0> class C1
irb(main):002:1>   MSG = 'msg1'
irb(main):003:1>   MSG2 = 'msg2'
irb(main):004:1>   class Cls2
irb(main):005:2>     MSG = 'C2.msg1'
irb(main):006:2>     puts MSG
irb(main):007:2>     puts MSG2
irb(main):008:2>   end
irb(main):009:1>   puts MSG
irb(main):010:1>   puts MSG2
irb(main):011:1> end
C2.msg1
msg2
msg1
msg2
=> nil

以下, 解説より抜粋.

  • クラスがネストしている場合, 定数の探索は, 自クラス→外側のクラスの順で行われる
  • 設問では 6 行目で宣言している MSG は, 5 行目で宣言している定数 MSG を参照する
  • 7 行目の MSG2 は, 3 行目で宣言している MSG2 を参照する

ちなみに, 以下のようなコードだった場合にどのように出力されるか.

class Cls1
  MSG = 'msg1'
  MSG2 = 'msg2'
  class Cls2
    MSG = 'Cls2.msg1'
    puts Cls1::MSG
    puts MSG2
  end
  puts Cls2::MSG
  puts MSG2
end

以下, 解答.

msg1
msg2
Cls2.msg1
msg2

以下, irb にて確認.

irb(main):001:0> class Cls1
irb(main):002:1>   MSG = 'msg1'
irb(main):003:1>   MSG2 = 'msg2'
irb(main):004:1>   class Cls2
irb(main):005:2>     MSG = 'Cls2.msg1'
irb(main):006:2>     puts Cls1::MSG
irb(main):007:2>     puts MSG2
irb(main):008:2>   end
irb(main):009:1>   puts Cls2::MSG
irb(main):010:1>   puts MSG2
irb(main):011:1> end
msg1
msg2
Cls2.msg1
msg2
=> nil

フムフム.