ようへいの日々精進XP

よかろうもん

2018 年 07 月 29 日 (日)

ジョギング

  • 香椎浜 x 2 周
  • 引き続き, 左足太もも前あたりに突っ張るような痛み...嫌な痛みなのでちょっと休むことを検討

日課

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

ゴロゴロ

台風が近づいているということで, 終日ゴロゴロ. 朝, 5 時過ぎに目が覚めたので適度に眠気に襲われて寝て起きてを繰り返していた感じ.

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

標準添付ライブラリ (6)

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

以下, 解説より抜粋.

irb(main):008:0> (1 + 1).class
=> Fixnum
irb(main):009:0> (1 + 1.0).class
=> Float
irb(main):010:0> (1 + 1r).class
=> Rational
irb(main):011:0> (1 + 1i).class
=> Complex
irb(main):012:0> (1.0 + 1r).class
=> Float
irb(main):013:0> (1.0 + 1i).class
=> Complex
irb(main):014:0> (1r + 1i).class
=> Complex

標準添付ライブラリ (7)

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

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> 
irb(main):003:0* d1 = DateTime.new
=> #<DateTime: -4712-01-01T00:00:00+00:00 ((0j,0s,0n),+0s,2299161j)>
irb(main):004:0> d2 = DateTime.new
=> #<DateTime: -4712-01-01T00:00:00+00:00 ((0j,0s,0n),+0s,2299161j)>
irb(main):005:0> p (d2 - d1).class
Rational
=> Rational

以下, 解説より抜粋.

ちなみに, Time クラス同士の演算結果は Float となる.

irb(main):007:0> t1 = Time.new
=> 2018-07-15 16:45:21 +0900
irb(main):008:0> t2 = Time.new
=> 2018-07-15 16:45:27 +0900
irb(main):009:0> p (t2 - t1).class
Float
=> Float

標準添付ライブラリ (9)

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

require 'yaml'
dir = <<EOY
file1:
  name: app.rb
  data: ruby
file2:
  - aaaa.rb
  - ruby
EOY
p YAML.load(dir)

以下, 解答.

  1. {"file1" => {"name" => "app.rb", "data" => "ruby"}}

以下, irb にて確認.

irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> dir = <<EOY
irb(main):003:0" file1:
irb(main):004:0"   name: app.rb
irb(main):005:0"   data: ruby
irb(main):006:0" EOY
=> "file1:\n  name: app.rb\n  data: ruby\n"
irb(main):007:0> p YAML.load(dir)
{"file1"=>{"name"=>"app.rb", "data"=>"ruby"}}
=> {"file1"=>{"name"=>"app.rb", "data"=>"ruby"}}

以下, 解説より抜粋.

  • 設問の YAML 形式のデータはハッシュとして読み込まれる

以下, 配列を含む場合.a

irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> dir = <<EOY
irb(main):003:0" file1:
irb(main):004:0"   name: app.rb
irb(main):005:0"   data: ruby
irb(main):006:0" file2:
irb(main):007:0"   - aaaa.rb
irb(main):008:0"   - ruby
irb(main):009:0" EOY
=> "file1:\n  name: app.rb\n  data: ruby\nfile2:\n  - aaaa.rb\n  - ruby\n"
irb(main):010:0> p YAML.load(dir)
{"file1"=>{"name"=>"app.rb", "data"=>"ruby"}, "file2"=>["aaaa.rb", "ruby"]}
=> {"file1"=>{"name"=>"app.rb", "data"=>"ruby"}, "file2"=>["aaaa.rb", "ruby"]}

標準添付ライブラリ (10)

Q24. stringio ライブラリの説明として適切な記述を全てを選べ.

以下, 解答.

  1. 文字列を IO オブジェクトと同じように扱える

以下, 解説より抜粋.

  • stringio ライブラリは, 文字列に IO オブジェクトと同じインターフェースを持たせる StringIO クラスを含む
  • StringIO クラスは IO クラスを継承したクラスでは無い

標準添付ライブラリ (11)

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

array = [1, 2, 3].freeze
array += [4, 5]
p array

以下, 解答.

  1. [1, 2, 3, 4, 5] と表示される

以下, irb にて確認.

irb(main):011:0> array = [1, 2, 3].freeze
=> [1, 2, 3]
irb(main):012:0> array += [4, 5]
=> [1, 2, 3, 4, 5]
irb(main):013:0> p array
[1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

以下, 解説より抜粋.

  • freeze はオブジェクトの内容変更を禁止するが, 参照変数自身は変更可能
  • 設問では変数 array を破壊的に変更 (concat, uniq! 等)することは出来ないが, 変数 array が別の変数を参照するように変更することは出来る

以下, ドキュメントより引用.

irb(main):001:0> a1 = 'foo'.freeze
=> "foo"
irb(main):002:0> a1 = 'bar'
=> "bar"
irb(main):003:0> a2 = 'foo'.freeze
=> "foo"
irb(main):004:0> a2.replace('bar')
RuntimeError: can't modify frozen String

凍結されるのはオブジェクトであり、変数ではありません。代入などで変数の指す オブジェクトが変化してしまうことは freeze では防げません。 freeze が防ぐのは、 `破壊的な操作' と呼ばれるもの一般です。

フムフム.