ジョギング
- ホテルから皇居を一周で 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
フムフム.