ようへいの日々精進XP

よかろうもん

2018 年 07 月 12 日 (木)

ジョギング

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

日課

  • お休み

夕飯

  • パスタを作る

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

オブジェクト指向 (4)

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

class A
  @@x = 0
  class << self
    @@x = 1
    def x
      @@x
    end
  end
  def x
    @@x = 2
  end
end

class B < A
  @@x = 3
end

p A.x

以下, 解答.

3 が表示される

以下, irb による確認.

irb(main):001:0> class A
irb(main):002:1>   @@x = 0
irb(main):003:1>   class << self
irb(main):004:2>     @@x = 1
irb(main):005:2>     def x
irb(main):006:3>       @@x
irb(main):007:3>     end
irb(main):008:2>   end
irb(main):009:1>   def x
irb(main):010:2>     @@x = 2
irb(main):011:2>   end
irb(main):012:1> end
=> :x
irb(main):013:0> 
irb(main):014:0* class B < A
irb(main):015:1>   @@x = 3
irb(main):016:1> end
=> 3
irb(main):017:0> 
irb(main):018:0* p A.x
3
=> 3

以下, 解説より抜粋.

  • クラス変数は, スーパークラスとサブクラス間で共有される
  • 設問では, クラス B の @@x = 3 が変数 x の最終定義になる

オブジェクト指向 (5)

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

# コード
module M
  def hoge
    puts 'hoge'
  end
end

class A
  [ x ] M
end

A.hoge

# 実行結果
hoge

以下, 解答.

extend

以下, irb による確認.

irb(main):001:0> module M
irb(main):002:1>   def hoge
irb(main):003:2>     puts 'hoge'
irb(main):004:2>   end
irb(main):005:1> end
=> :hoge
irb(main):006:0> 
irb(main):007:0* class A
irb(main):008:1>   extend M
irb(main):009:1> end
=> A
irb(main):010:0> 
irb(main):011:0* A.hoge
hoge
=> nil

以下, 解説より抜粋.

  • モジュール内のメソッドをクラスメソッドとして取り込むには extend を用いる

オブジェクト指向 (6)

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

class A
  $a = self
  def hoge
    $b = self
  end
end

a = A.new
print A == $a, A.new == $b

以下, 解答.

truefalse が出力される

以下, irb による確認.

irb(main):001:0> class A
irb(main):002:1>   $a = self
irb(main):003:1>   def hoge
irb(main):004:2>     $b = self
irb(main):005:2>   end
irb(main):006:1> end
=> :hoge
irb(main):007:0> 
irb(main):008:0* a = A.new
=> #<A:0x00559d516cbcb0>
irb(main):009:0> print A == $a, A.new == $b
truefalse=> nil

以下, 解説より抜粋.

  • クラス定義中の self は, そのクラスオブジェクトである
  • インスタンスメソッド中の self は, そのクラスのオブジェクトである
  • $a にはクラス A が代入され, $bhoge が実行されなければ値は代入されないので nil となる

truetrue と出力される為には, 以下のように実行する.

irb(main):010:0> print A == $a, A.new.hoge == $b
truetrue=> nil

フムフム.

2018 年 07 月 11 日 (水)

ジョギング

  • 香椎浜 x 2 周
  • 右足の太ももの前に痛み
  • ちょっと休むかな...

日課

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

体調

  • 先週末から体調がイマイチ
  • ずーっと眠気がひどい

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

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

class A
  private
  def foo
    puts 'A'
  end
end

class B < A
  public :foo
end

B.new.foo

以下, 解答.

  1. A と表示される

以下, irb による確認.

irb(main):001:0> class A
irb(main):002:1>   private
irb(main):003:1>   def foo
irb(main):004:2>     puts 'A'
irb(main):005:2>   end
irb(main):006:1> end
=> :foo
irb(main):007:0> 
irb(main):008:0* class B < A
irb(main):009:1>   public :foo
irb(main):010:1> end
=> B
irb(main):011:0> 
irb(main):012:0* B.new.foo
A
=> nil

以下, 解説より抜粋.

  • A クラスの private メソッド foo は, サブクラス B で public に再定義されている

オブジェクト指向 (2)

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

# コード
class X
  [ x ]
  
  def initialize
    @x = 0
  end
end

a = X.new
a.x = 10
puts a.x

# 実行結果
10

以下, 解答.

# 解答 1
attr_reader :x
attr_writer :x

# 解答 2
attr_accessor :x

# 解答 3
def x
  @x
end
def x=(x)
  @x = x
end

以下, irb にて確認.

irb(main):001:0> class X
irb(main):002:1>   attr_reader :x
irb(main):003:1>   attr_writer :x  
irb(main):004:1> 
irb(main):005:1*   def initialize
irb(main):006:2>     @x = 0
irb(main):007:2>   end
irb(main):008:1> end
=> :initialize
irb(main):009:0> 
irb(main):010:0* a = X.new
=> #<X:0x0056354d43f2f0 @x=0>
irb(main):011:0> a.x = 10
=> 10
irb(main):012:0> puts a.x
10
=> nil
irb(main):013:0> a = X.new
=> #<X:0x0056354d429090 @x=0>
irb(main):014:0> a.x = 10
=> 10
irb(main):015:0> puts a.x
10
=> nil
irb(main):016:0> 
irb(main):017:0* class X
irb(main):018:1>   attr_accessor :x
irb(main):019:1> 
irb(main):020:1*   def initialize
irb(main):021:2>     @x = 0
irb(main):022:2>   end
irb(main):023:1> end
=> :initialize
irb(main):024:0> 
irb(main):025:0* a = X.new
=> #<X:0x0056354d3e04f8 @x=0>
irb(main):026:0> a.x = 10
=> 10
irb(main):027:0> puts a.x
10
=> nil
irb(main):028:0> class X
irb(main):029:1>   def x
irb(main):030:2>     @x
irb(main):031:2>   end
irb(main):032:1>   def x=(x)
irb(main):033:2>     @x = x
irb(main):034:2>   end
irb(main):035:1> 
irb(main):036:1*   def initialize
irb(main):037:2>     @x = 0
irb(main):038:2>   end
irb(main):039:1> end
=> :initialize
irb(main):040:0> 
irb(main):041:0* a = X.new
=> #<X:0x0056354d2c5780 @x=0>
irb(main):042:0> a.x = 10
=> 10
irb(main):043:0> puts a.x
10
=> nil

オブジェクト指向 (3)

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

class Hoge
  def fuga(o = nil)
    [ x ]
  end
  
  private
  
  def hoge
    puts 'Hoge'
  end
end

以下, 解答.

hoge

以下, irb による確認.

irb(main):001:0> class Hoge
irb(main):002:1>   def fuga(o = nil)
irb(main):003:2>     hoge
irb(main):004:2>   end
irb(main):005:1>   
irb(main):006:1*   private
irb(main):007:1>   
irb(main):008:1*   def hoge
irb(main):009:2>     puts 'Hoge'
irb(main):010:2>   end
irb(main):011:1> end
=> :hoge

以下, 解説より抜粋.

  • private メソッドは, レシーバを指定した呼び出しは出来ない

フムフム.

2018 年 07 月 10 日 (火)

ジョギング

  • 香椎浜 x 2 周
  • なんかギクシャクした感じがずーっと続いている
  • 右足に強い張り

日課

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

夕飯

  • 適当に冷製パスタを作った
  • 適当な割には美味しかった

今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (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)

オブジェクト指向

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

class A
  $a = self
  def foo
    $b = self
  end
end

a = A.new
print A == $a, A.new == $b

以下, 解答.

  1. truefalse が表示される

以下, irb にて確認.

irb(main):001:0> class A
irb(main):002:1>   $a = self
irb(main):003:1>   def foo
irb(main):004:2>     $b = self
irb(main):005:2>   end
irb(main):006:1> end
=> :foo
irb(main):007:0> 
irb(main):008:0* a = A.new
=> #<A:0x005605a2273c58>
irb(main):009:0> print A == $a, A.new == $b
truefalse=> nil
  • クラス定義中の self は, そのクラスオブジェクトとなる
  • インスタンスメソッド中の self は, そのクラスのオブジェクトとなる
  • $a には クラス A が代入されるが, $b は, メソッド foo が実行されなければ値は代入されない為, nil となる

両方が true になるパターン.

irb(main):001:0> class A
irb(main):002:1>   $a = self
irb(main):003:1>   def foo
irb(main):004:2>     $b = self
irb(main):005:2>   end
irb(main):006:1> end
=> :foo
irb(main):007:0> a = A.new
=> #<A:0x0055c380ca0c08>
irb(main):008:0> print A == $a
true=> nil
irb(main):009:0> print A.new.foo == $b
true=> nil

DateTime 同士の演算

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

require 'Date'
d1 = DateTime.new
d2 = DateTime.new
p (d2 - d1).class

以下, 解答.

  1. Rational が表示される

以下, irb にて確認.

irb(main):001:0> require 'date'
=> true
irb(main):002:0> d1 = DateTime.new
=> #<DateTime: -4712-01-01T00:00:00+00:00 ((0j,0s,0n),+0s,2299161j)>
irb(main):003:0> d2 = DateTime.new
=> #<DateTime: -4712-01-01T00:00:00+00:00 ((0j,0s,0n),+0s,2299161j)>
irb(main):004:0> p (d2 - d1).class
Rational
=> Rational

以下, 解説より抜粋.

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

  • DateTimeDate クラスのサブクラス
  • Date クラスは日付のみ
  • DateTime クラスは時刻も扱うことが出来る
irb(main):001:0> require 'date'
=> true
irb(main):002:0> a = DateTime.new(1993, 2, 24, 12, 30, 45)
=> #<DateTime: 1993-02-24T12:30:45+00:00 ((2449043j,45045s,0n),+0s,2299161j)>
irb(main):003:0> b = DateTime.parse('1993-02-24T12:30:45')
=> #<DateTime: 1993-02-24T12:30:45+00:00 ((2449043j,45045s,0n),+0s,2299161j)>
irb(main):004:0> b += 10
=> #<DateTime: 1993-03-06T12:30:45+00:00 ((2449053j,45045s,0n),+0s,2299161j)>
irb(main):005:0> (b - a)
=> (10/1)
irb(main):006:0> (b - a).class
=> Rational
irb(main):007:0> DateTime.now - 1
=> #<DateTime: 2018-07-02T09:23:19+09:00 ((2458302j,1399s,943836661n),+32400s,2299161j)>
irb(main):008:0> (DateTime.now - 1).class
=> DateTime

フムフム.

2018 年 07 月 09 日 (月)

ジョギング

  • 香椎浜 x 2 周
  • なんかギクシャクした感じがずーっと続いている

日課

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

梅雨明け

  • すごい爪痕を残して梅雨が明けた
  • 被災された方々には心からお見舞い申しあげます
  • これから暑さも含めた戦いが待っているのかと考えると, たかが雨, されど雨, すごく胸が痛くなった

放送大学に提出していたレポートが添削されて返ってきた

  • 読みづらい文字だったけど, ちゃんと赤ペン入れてくれていた
  • 一応, 単位認定試験の受験資格を得ることが出来た

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

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)

アクセサメソッド

以下のコードにおいて, 指定した行を書き換えた時に同じ結果になるものを選べ(複数選択)

class C
  attr_accessor :v # ここを書き換える
end

c = C.new
c.v = 100
p c.v

上記のコードをとりあえず irb で実行してみる.

irb(main):001:0> class C
irb(main):002:1>   attr_accessor :v # ここを書き換える
irb(main):003:1> end
=> nil
irb(main):004:0> 
irb(main):005:0* c = C.new
=> #<C:0x00558de4a1c260>
irb(main):006:0> c.v = 100
=> 100
irb(main):007:0> p c.v
100
=> 100

以下, 解答.

# 解答 1
attr_reader :v
attr_writer :v

# 解答 2
def v=(other)
  @v = other
end
def v
  @v
end

以下, 解答を irb にて確認.

# 解答 1
irb(main):001:0> class C
irb(main):002:1>   attr_reader :v
irb(main):003:1>   attr_writer :v
irb(main):004:1> end
=> nil
irb(main):005:0> 
irb(main):006:0* c = C.new
=> #<C:0x00557a3df1fad8>
irb(main):007:0> c.v = 100
=> 100
irb(main):008:0> p c.v
100
=> 100

# 解答 2
irb(main):009:0> class C
irb(main):010:1>   def v=(other)
irb(main):011:2>     @v = other
irb(main):012:2>   end
irb(main):013:1>   def v
irb(main):014:2>     @v
irb(main):015:2>   end
irb(main):016:1> end
=> :v
irb(main):017:0> 
irb(main):018:0* c = C.new
=> #<C:0x00557a3dec1618>
irb(main):019:0> c.v = 100
=> 100
irb(main):020:0> p c.v
100
=> 100

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

  • Module#attr_accessor
    • インスタンス変数 name に対する, 読み取り及び書き込みメソッドの両方を定義する
    • パラメータは String 又は Symbol で渡す (複数定義が可能)
    • このメソッドで定義されるメソッドは以下の通り
def name
  @name
end
def name=(val)
  @name = val
end
  • Module#attr_reader
    • インスタンス変数 name に対する, 読み取りメソッドを定義する
    • パラメータは String 又は Symbol で渡す (複数定義が可能)
    • このメソッドで定義されるメソッドは以下の通り
def name
  @name
end
  • Module#attr_writer
    • インスタンス変数 name に対する, 書き込みメソッドを定義する
    • パラメータは String 又は Symbol で渡す (複数定義が可能)
    • このメソッドで定義されるメソッドは以下の通り
def name=(val)
  @name = val
end

フムフム.

2018 年 07 月 08 日 (日)

ジョギング

  • 香椎浜 x 2 周
  • なんかギクシャクした感じがずーっと続いている

日課

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

夕飯

  • 奥さんが得意としている麻婆茄子
  • 美味しかった

終日

  • 色々とやりたいことがあったけど, 体調がイマイチで終日ダラダラしていた

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

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)

メソッドの可視性

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

class C
  protected
  def initialize
  end
end

p C.new.methods.include? :initialize

以下, 解答.

true

以下, irb にて確認.

irb(main):001:0> class C
irb(main):002:1>   protected
irb(main):003:1>   def initialize
irb(main):004:2>   end
irb(main):005:1> end
=> :initialize
irb(main):006:0> 
irb(main):007:0* p C.new.methods.include? :initialize
true
=> true

以下, 解説より抜粋.

  • initialize メソッドは private メソッドである
  • protected メソッドは仲間クラス (自クラスかサブクラスのレシーバー) へ公開されているが, それ以外のクラスには隠蔽されている
  • 仲間クラスから参照するために, メソッドとしては公開されている
  • Object#methodspublic 及び protected メソッドの名前を返す

以下, privatepublic だった場合の確認.

irb(main):001:0> class C
irb(main):002:1>   public
irb(main):003:1>   def initialize
irb(main):004:2>   end
irb(main):005:1> end
=> :initialize
irb(main):006:0> 
irb(main):007:0* p C.new.methods.include? :initialize
false
=> false
irb(main):008:0> p C.new.private_methods.include? :initialize
true
=> true

前述の通り, initialize メソッドは private メソッドであり, public を明示的に指定しても private のまま. protected を指定すると, initialize メソッドは protected メソッドになる. 尚, private を指定するパターンは割愛.

正規表現

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

p "Matz is my tEacher".scan(/[is|my]/).length

以下, 解答.

4 が出力される

以下, irb にて確認.

irb(main):001:0> p "Matz is my tEacher".scan(/[is|my]/).length
4
=> 4

以下, 解説より抜粋.

  • String#scan はマッチした部分文字列を配列で返す
  • 正規表現[] は囲まれた文字 1 つ 1 つにマッチする
  • |正規表現では OR のメタ文字である
  • 設問では, |[] に囲まれているため, これもマッチ対象となる

尚, String#scan については, 以下の通り.

self に対して pattern を繰り返しマッチし、 マッチした部分文字列の配列を返します。 pattern が正規表現で括弧を含む場合は、 括弧で括られたパターンにマッチした部分文字列の配列の配列を返します。

以下, String#scan のみの実行結果.

irb(main):002:0> p "Matz is my tEacher".scan(/[is|my]/)
["i", "s", "m", "y"]
=> ["i", "s", "m", "y"]

以下, String#scan で色々確認.

irb(main):005:0> p "Matz is my tEacher".scan(/my/)
["my"]
=> ["my"]
irb(main):006:0> p "Matz is my tEacher".scan(/[my]/)
["m", "y"]
=> ["m", "y"]
irb(main):007:0> p "Matz is my tEacher".scan(/is/)
["is"]
=> ["is"]
irb(main):008:0> p "Matz is my tEacher".scan(/[is]/)
["i", "s"]
=> ["i", "s"]
irb(main):009:0> p "Matz is my tEacher".scan('is')
["is"]
=> ["is"]
irb(main):010:0> p "Matz is my tEacher".scan('my')
["my"]
=> ["my"]

フムフム.

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

フムフム.

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

フムフム.

2018 年 07 月 05 日 (木)

ジョギング

  • おやすみ

日課

  • おやすみ

東京出張

  • 武川さんと色々と話したり, 計画作業を 2 件こなしたり
  • 大住さんと新橋の立ち呑み屋さんで色々と話しが出来てよかった

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

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)

文法 (論理演算子)

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

v1 = 1 / 2 == 0
v2 = !!v1 or raise RuntimeError
puts v2 and false

以下, 解答.

true が表示される

以下, irb にて確認.

irb(main):001:0> v1 = 1 / 2 == 0
=> true
irb(main):002:0> v2 = !!v1 or raise RuntimeError
=> true
irb(main):003:0> puts v2 and false
true
=> nil

以下, 解説より抜粋.

  • 1 行目では Fixnum クラス同士の除算は Fixnum クラスとなり, 0 == 0 が評価され true となる
  • 2 行目の or では左辺が真であれば, 右辺は評価されず, 左辺の結果が返る
  • !!v1 は否定 (!) の否定 (!) となる為, true となり, 左辺が true となっているので v2 には true が代入される
  • 3 行目の and は左辺が真であれば, 右辺の結果を返し, 左辺が偽であれば左辺の結果を返すが, and は優先度が低い演算子である為, puts v2 が評価される

and, or, not の優先度

  • 論理積 (&&), 論理和 (||), 否定 (!) に対応するもので, これらと同様の動きをする
  • 両者の違いは, 自己代入出来ないこと, 代入演算子よりも演算子の優先度が低いことなどが挙げられる

以下, &&and の違い.

# p (1 && 2) と同義
irb(main):006:0> p 1 && 2
2
=> 2
# p (1) and 2 と同義
irb(main):007:0> p 1 and 2
1
=> 2
  • p 1 && 21 && 2論理積の結果が p に渡されている
  • p 1 and 2p 1 の実行結果と 2論理積が渡されている

以下のように and を利用する場合, 二重括弧を利用することで, && と同等の結果を得ることが出来る.

irb(main):008:0> p (1 && 2)
2
=> 2
irb(main):009:0> p ((1 and 2))
2
=> 2

or は, 左辺を評価して結果が真であった場合にはその値を返し, 左辺の評価結果が偽であった場合には右辺を評価してその評価結果を返す. or についても and と同様に p false の実行結果と true が評価される (or の優先度が低い)為, 以下のような結果となる.

irb(main):019:0> p false || true
true
=> true
irb(main):020:0> p false or true
false
=> true

not は, 式の値が真である時には を, 偽であるには真を返す.

irb(main):024:0> p ! true
false
=> false
irb(main):025:0> p not true
SyntaxError: (irb):25: syntax error, unexpected keyword_true, expecting '('
irb(main):028:0> p (! false)
true
=> true
irb(main):030:0> p ((not false))
true
=> true

Enumerable と Enumerator

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

class IPAddr
  include Enumerable

  def initialize(ip_addr)
    @ip_addr = ip_addr
  end

  def each
    return __(1)__ unless block_given?

    @ip_addr.split('.').each do |octet|
      yield octet
    end
  end
end

addr = IPAddr.new("192.10.20.30")
enum = addr.each

p enum.next # 192と表示される
p enum.next # 10と表示される
p enum.next # 20と表示される
p enum.next # 30と表示される

以下, 解答.

to_enum enum_for

以下, irb にて確認.

irb(main):001:0> class IPAddr
irb(main):002:1>   include Enumerable
irb(main):003:1> 
irb(main):004:1*   def initialize(ip_addr)
irb(main):005:2>     @ip_addr = ip_addr
irb(main):006:2>   end
irb(main):007:1> 
irb(main):008:1*   def each
irb(main):009:2>     return to_enum unless block_given?
irb(main):010:2> 
irb(main):011:2*     @ip_addr.split('.').each do |octet|
irb(main):012:3*       yield octet
irb(main):013:3>     end
irb(main):014:2>   end
irb(main):015:1> end
=> :each
irb(main):016:0> 
irb(main):017:0* addr = IPAddr.new("192.10.20.30")
=> #<IPAddr:0x005611774ad498 @ip_addr="192.10.20.30">
irb(main):018:0> enum = addr.each
=> #<Enumerator: #<IPAddr:0x005611774ad498 @ip_addr="192.10.20.30">:each>
irb(main):020:0> enum.next
=> "192"
irb(main):021:0> enum.next
=> "10"
irb(main):022:0> enum.next
=> "20"
irb(main):023:0> enum.next
=> "30"
irb(main):001:0> class IPAddr
irb(main):002:1>   include Enumerable
irb(main):003:1> 
irb(main):004:1*   def initialize(ip_addr)
irb(main):005:2>     @ip_addr = ip_addr
irb(main):006:2>   end
irb(main):007:1> 
irb(main):008:1*   def each
irb(main):009:2>     return enum_for unless block_given?
irb(main):010:2> 
irb(main):011:2*     @ip_addr.split('.').each do |octet|
irb(main):012:3*       yield octet
irb(main):013:3>     end
irb(main):014:2>   end
irb(main):015:1> end
=> :each
irb(main):016:0> 
irb(main):017:0* addr = IPAddr.new("192.10.20.30")
=> #<IPAddr:0x0055afc3901730 @ip_addr="192.10.20.30">
irb(main):018:0> enum = addr.each
=> #<Enumerator: #<IPAddr:0x0055afc3901730 @ip_addr="192.10.20.30">:each>
irb(main):019:0> enum.next
=> "192"
irb(main):020:0> enum.next
=> "10"
irb(main):021:0> enum.next
=> "20"
irb(main):022:0> enum.next
=> "30"

以下, 解説より抜粋.

  • Enumerable をインクルードした場合, each メソッドを実装する必要があり, ブロックが渡されない場合でも, Enumerator オブジェクトを返すようにして外部イテレータとしても使えるようにする
  • Enumerator オブジェクトを作成するメソッドは enum_for, または to_enum を利用する

フムフム.

2018 年 07 月 04 日 (水)

ジョギング

日課

  • お休み

SRE 本輪読会

  • 月一の勉強会
  • 今日は自分が 9 章「単純さ」について話した
  • 資料のタイポもさることながら, 漢字があまりに読めないので漢字の勉強からやり直しだなって思った

明日から

  • 東京出張

今日のるびぃ ~ 数値型クラスについて ~

数値型クラスについて気になったことをメモ. 尚, irb に動作確認環境は以下の通り.

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

尚, Ruby技術者認定試験合格教本(Silver/Gold対応)Ruby公式資格教科書 を参考にした.

Numeric クラス

子クラスには以下のようなクラスが属している.

  • Integer (整数)
    • Fixnum
    • Bignum (大きな整数になると自動的に Bignum に拡張される)
  • Float (浮動小数点)

各クラス同士の演算

この組み合わせについて, よく忘れるので...

irb(main):001:0> # Fixnum 同士
irb(main):002:0* (1 + 1).class
=> Fixnum
irb(main):003:0> # Fixnum と Float
irb(main):004:0* (1 + 1.0).class
=> Float
irb(main):005:0> # Fixnum と Rational
irb(main):006:0* (1 + 1r).class
=> Rational
irb(main):007:0> # Float と Rational
irb(main):008:0* (1.0 + 1r).class
=> Float
irb(main):009:0> # Fixnum と Complex
irb(main):010:0* (1 + 1i).class
=> Complex
irb(main):011:0> # Float と Complex
irb(main):012:0* (1.0 + 1i).class
=> Complex
irb(main):013:0> # Ration と Complex
irb(main):014:0* (1r + 1i).class
=> Complex

数値演算

数値演算について見てみる.

irb(main):001:0> # 演算
irb(main):002:0* 1 + 2
=> 3
irb(main):003:0> 1 - 2
=> -1
irb(main):004:0> 2 * 3
=> 6
irb(main):005:0> 4 / 2
=> 2
irb(main):006:0> 4 % 3
=> 1

irb(main):007:0> # 比較
irb(main):008:0* 1 == 1
=> true
irb(main):009:0> 1 != 2
=> true
irb(main):010:0> 1 < 2
=> true
irb(main):011:0> 2 >= 2
=> true

irb(main):001:0> # UFO 演算子
irb(main):002:0* 100 <=> 10
=> 1
irb(main):003:0> 100 <=> 100
=> 0
irb(main):004:0> 10 <=> 100
=> -1

irb(main):005:0> # 自己代入演算子
irb(main):006:0* a = 100
=> 100
irb(main):007:0> a += 1
=> 101
irb(main):008:0> a -= 1
=> 100
irb(main):009:0> a *=2
=> 200
irb(main):010:0> a **=2
=> 40000
  • UFO 演算子 (比較演算子) は, 比較の結果を数値で返す
    • 左辺の値が右辺の値より大きければ 1
    • 等しければ 0
    • 左辺の値が右辺の値より小さければ -1
  • Ruby には ++-- のようなインクリメント, デクリメント演算子は存在せず, 自己代入演算子を利用する

数値型クラスに関する問題

Q1. [ x ] に記述すると, 実行結果にならないコードを全て選ぶ

# コード
puts [ x ]

# 実行結果
0.8

以下, 解答.

  • 4 / 5
  • 4 / 5r

以下, irb による確認.

irb(main):015:0> 4 / 5
=> 0
irb(main):016:0> 4 / 5r
=> (4/5)

尚, 4 / 5r については, to_f を付けると 0.8 になる.

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

a = 1.0 + 1
a = a + (1 / 2r)
a = a + (1 + 2i)

以下, 解答.

  1. 1 行目の a の値が Float インスタンスとなる
  2. 3 行目の a お値が Complex インスタンスとなる

以下, irb にて確認.

irb(main):001:0> a = 1.0 + 1
=> 2.0
irb(main):002:0> a.class
=> Float
irb(main):003:0> a = a + (1 / 2r)
=> 2.5
irb(main):004:0> a.class
=> Float
irb(main):005:0> a = a + (1 + 2i)
=> (3.5+2i)
irb(main):006:0> a.class
=> Complex

以下, 解説より抜粋.

フムフム.

2018 年 07 月 03 日 (火)

ジョギング

  • 台風接近の為, お休み

日課

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

サッカーワールドカップ

  • 日本対ベルギー
  • 深夜 3 時ということでリアルタイムでは観戦せず
  • 朝起きてから結果を見て残念だったけど, 試合内容に感動して勇気づけられた

台風接近

  • 朝から雨が降ったりやんだり
  • 夕方から風が強くなって, いまでも風雨が強い

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

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)

const_defined?

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

mod = Module.new

mod.module_eval do
  EVAL_CONST = 100
end

puts "EVAL_CONST is defined? #{mod.const_defined?(:EVAL_CONST)}"
puts "EVAL_CONST is defined? #{Object.const_defined?(:EVAL_CONST)}"

以下, 解答.

EVAL_CONST is defined? true
EVAL_CONST is defined? true

と出力される. 以下, irb による確認.

irb(main):001:0> mod = Module.new
=> #<Module:0x0055a82e4d0d88>
irb(main):002:0> 
irb(main):003:0* mod.module_eval do
irb(main):004:1*   EVAL_CONST = 100
irb(main):005:1> end
=> 100
irb(main):006:0> 
irb(main):007:0* puts "EVAL_CONST is defined? #{mod.const_defined?(:EVAL_CONST)}"
EVAL_CONST is defined? true
=> nil
irb(main):008:0> puts "EVAL_CONST is defined? #{Object.const_defined?(:EVAL_CONST)}"
EVAL_CONST is defined? true
=> nil

以下, 解説より抜粋.

  • 設問の module_eval では, ブロックで定義されている為, 定数はトップレベルで定義されることになる
  • トップレベルの定数 = Object クラスの定数となる為, mod.const_defined?Object.const_defined?true を返す
  • const_defined? は, 第 2 引数に継承関係を探索するか指定出来る為, 引数の有無によって結果が異なる

以下のような場合にどうなるか.

mod = Module.new

mod.module_eval %Q{
  EVAL_CONST = 100
}

puts "EVAL_CONST is defined? #{mod.const_defined?(:EVAL_CONST)}"
puts "EVAL_CONST is defined? #{Object.const_defined?(:EVAL_CONST)}"

以下のように出力されると想定.

EVAL_CONST is defined? true
EVAL_CONST is defined? false

以下, irb による確認.

irb(main):001:0> mod = Module.new
=> #<Module:0x0055d0e10d4f00>
irb(main):002:0> 
irb(main):003:0* mod.module_eval %Q{
irb(main):004:0"   EVAL_CONST = 100
irb(main):005:0" }
=> 100
irb(main):006:0> 
irb(main):007:0* puts "EVAL_CONST is defined? #{mod.const_defined?(:EVAL_CONST)}"
EVAL_CONST is defined? true
=> nil
irb(main):008:0> puts "EVAL_CONST is defined? #{Object.const_defined?(:EVAL_CONST)}"
EVAL_CONST is defined? false
=> nil

module_eval でメソッドを定義する場合, 文字列で定義する場合とブロックで定義するでネストの状態が異なる為, 定数の参照スコープも異なる. 上記の例では, 文字列で定義されている為, 定数の参照は mod インスタンス内に制限されていることが判る.

alias

以下の実行結果になるように __(1)__ に当てはまるコードを選ぶ.

class String
  __(1)__
end

p '12345'.foo

# 実行結果
54321

以下, 解答.

alias foo reverse
alias :foo :reverse

以下, irb による確認.

irb(main):001:0> class String
irb(main):002:1>   alias foo reverse
irb(main):003:1> end
=> nil
irb(main):004:0> 
irb(main):005:0* p '12345'.foo
"54321"
=> "54321"
irb(main):006:0> exit
kappa@tpX1-Carbon:~/sandbox/ruby-exam-gold$ irb
irb(main):001:0> class String
irb(main):002:1>   alias :foo :reverse
irb(main):003:1> end
=> nil
irb(main):004:0> 
irb(main):005:0* p '12345'.foo
"54321"
=> "54321"

以下, 解説より抜粋.

alias new_method old_method
alias :new_method :old_method
alias $new_global_val $old_global_val
  • alias_method でもメソッドに別名を付けることが出来る
  • alias との違いは, メソッド名は String か Symbol で指定する, また, グローバル変数の別名を付けることは出来ない
irb(main):006:0> module Kernel
irb(main):007:1>   alias_method :foo, :puts
irb(main):008:1> end
=> Kernel
irb(main):009:0> foo 'foo'
foo
=> nil

フムフム.