ようへいの日々精進XP

よかろうもん

2018 年 07 月 07 日 (土)

ジョギング

  • ホテルから皇居を一周で 45 分ほど
  • ペースはそんなに速いつもりではなかったけど, 後半はバテバテだった

日課

  • おやすみ

レトロ PC

ホテルをチェックアウトして, ちょっとだけアキバに立ち寄ってレトロ PC を見てきた.

帰りの飛行機の搭乗まで少し時間があったので、山田帽子店に行こうと思ったけど、心が折れて秋葉原でレトロ PC に会ってきた。この写真に載ってるパソコン全部欲しかったよなあ。

帰福

羽田空港のエアポートラウンジで昨日のセミナーの一人振り返りとか Ruby の勉強をしてた.

自宅に戻ったら, 奥さんがあまり元気がなさそうでちょっとヤツレた感じだったので心配.

今日のるびぃ ~ 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

フムフム.