ようへいの日々精進XP

よかろうもん

2018 年 07 月 06 日 (金)

ジョギング

  • おやすみ
  • せっかく走る準備をしてきたけど, 朝から雨が降っていたので...

日課

  • おやすみ

アジャイル開発セミナー

  • 今回の出張の第一プライオリティ
  • ガチな講師 (Chef 界隈でも有名な吉羽さんとか) とガチな内容でアジャイル開発をガッツリ勉強した
  • やることを優先順位をつけて並べて, 小さい単位でスクラムを回して, スプリント毎に振り返りを行っていくという流れは今の業務にそのまま使えるなーとか, 沢山の気づきがあった
  • アジャイル開発と TDD の関連がイマイチ解らなかったので, このあたりは自分で勉強していこうと思っている

金町

  • 定時ダッシュして金町に顔を出した
  • よっちゃんはちょっと太っていて, 転んで頭をぶつけて 10 針縫ったとか...ほんと気をつけて欲しい
  • よっちゃんの後は, 「よしじん」→「やすらぎ」
  • きょーじさんと「レッツトライアゲイン」を歌って新橋に帰ってきた
  • いつも「お帰り〜」みたいな感じで迎えてくれる金町の皆さんには本当に感謝しかない

今日のるびぃ ~ REx - Ruby Examination にチャレンジ (46) ~

REx - Ruby Examination の問題を自分なりにアレンジした上で 1 〜 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)

Complex クラス同士の演算

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

val = 1i * 1i
puts val.class

以下, 解答.

  • complex が出力される

以下, irb による確認.

irb(main):001:0> val = 1i * 1i
=> (-1+0i)
irb(main):002:0> puts val.class
Complex
=> nil

以下, 解説より抜粋.

  • 1i複素数 (Complex) のオブジェクトを表している
  • Complex 同士の演算は Complex を返す

その他の Numeric クラスに属するクラス同士の演算について.

irb(main):001:0> # Integer と Integer
irb(main):002:0* (10 * 10).class
=> Fixnum
irb(main):003:0> # Integer と Float
irb(main):004:0* (10 * 10.0).class
=> Float
irb(main):005:0> # Integer と Rational
irb(main):006:0* (10 * 10r).class
=> Rational
irb(main):007:0> # Integer と Complex
irb(main):008:0* (10 * 10i).class
=> Complex
irb(main):009:0> # Float と Float
irb(main):010:0* (10.0 * 10.0).class
=> Float
irb(main):011:0> # Float と Rational
irb(main):012:0* (10.0 * 10r).class
=> Float
irb(main):013:0> # Float と Complex
irb(main):014:0* (10.0 * 10i).class
=> Complex
irb(main):015:0> # Rational と Rational
irb(main):016:0* (10r * 10r).class
=> Rational
irb(main):017:0> # Rational と Complex
irb(main):018:0* (10r * 10i).class
=> Complex
irb(main):019:0> # Complex と Complex
irb(main):020:0* (10i * 10i).class
=> Complex

Enumerator

以下のプログラムの実行結果を得るために __(1)__ に適切なメソッドをすべて選ぶ.

# コード
module Enumerable
  def with_prefix(prefix)
    return to_enum(__(1)__, prefix) { size } unless block_given?

    each do |char|
      yield "#{prefix} #{char}"
    end
  end
end

[1,2,3,4,5].with_prefix("Awesome").reverse_each {|char|
  puts char
}

# 実行結果
Awesome 5
Awesome 4
Awesome 3
Awesome 2
Awesome 1

以下, 解答.

  • :with_prefix
  • __method__

以下, irb による確認.

irb(main):001:0> module Enumerable
irb(main):002:1>   def with_prefix(prefix)
irb(main):003:2>     return to_enum(:with_prefix, prefix) { size } unless block_given?
irb(main):004:2> 
irb(main):005:2*     each do |char|
irb(main):006:3*       yield "#{prefix} #{char}"
irb(main):007:3>     end
irb(main):008:2>   end
irb(main):009:1> end
=> :with_prefix
irb(main):010:0> 
irb(main):011:0* [1,2,3,4,5].with_prefix("Awesome").reverse_each {|char|
irb(main):012:1*   puts char
irb(main):013:1> }
Awesome 5
Awesome 4
Awesome 3
Awesome 2
Awesome 1
=> #<Enumerator: [1, 2, 3, 4, 5]:with_prefix("Awesome")
irb(main):001:0> module Enumerable
irb(main):002:1>   def with_prefix(prefix)
irb(main):003:2>     return to_enum(__method__, prefix) { size } unless block_given?
irb(main):004:2> 
irb(main):005:2*     each do |char|
irb(main):006:3*       yield "#{prefix} #{char}"
irb(main):007:3>     end
irb(main):008:2>   end
irb(main):009:1> end
=> :with_prefix
irb(main):010:0> 
irb(main):011:0* [1,2,3,4,5].with_prefix("Awesome").reverse_each {|char|
irb(main):012:1*   puts char
irb(main):013:1> }
Awesome 5
Awesome 4
Awesome 3
Awesome 2
Awesome 1
=> #<Enumerator: [1, 2, 3, 4, 5]:with_prefix("Awesome")>

以下, 解説より抜粋.

  • 設問では, ブロックを渡さない場合に Enumerator オブジェクトを作成してメソッドをチェーン出来るようにしている
  • Enumerator オブジェクトを作成するためには, to_enum または, enum_for を利用する
  • 設問では, with_prefix を再び評価する必要がある為, __method__ または :with_prefix を引数に指定する
  • __method__ はメソッドの中で呼び出すと, そのメソッド名となる
irb(main):014:0> def awesome_method
irb(main):015:1>   __method__
irb(main):016:1> end
=> :awesome_method
irb(main):017:0> p awesome_method
:awesome_method
=> :awesome_method

フムフム.