ようへいの日々精進XP

よかろうもん

2018 年 05 月 02 日(水)

ジョギング

  • お昼に香椎浜 x 2 周
  • 途中から雨がすごく降ってきて, 久しぶりにびしょ濡れになった

日課

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

頭痛

  • クビからきている感じの頭痛が終日
  • 目の奥まで沁みてる感じ

今日のるびぃ ~ Ruby技術者認定試験【Gold】模擬問題を解いてみる (re: 9) ~

もう何度か解いているけど, 再び, Ruby技術者認定試験【Gold】模擬問題 を 3 ~ 5 問くらいずつ解いていく.

Q28. オブジェクト指向

以下の結果を出力するコードとして __(1)__ に当てはまるものを選択する.

# コード
class MyNum
  attr_reader :num
  def initialize(num)
    @num = num
  end
  __(1)__
end

num1 = MyNum.new(30)
num2 = MyNum.new(10)
num3 = MyNum.new(20)
p [num1, num2, num3].sort.map{|n| n.num }

# 実行結果
[10, 20, 30]

以下, 解答.

def <=>(other)
  @num <=> other.num
end

以下, irb による実行例.

irb(main):001:0> class MyNum
irb(main):002:1>   attr_reader :num
irb(main):003:1>   def initialize(num)
irb(main):004:2>     @num = num
irb(main):005:2>   end
irb(main):006:1>   def <=>(other)
irb(main):007:2>     @num <=> other.num
irb(main):008:2>   end
irb(main):009:1> end
=> :<=>
irb(main):010:0> 
irb(main):011:0* num1 = MyNum.new(30)
=> #<MyNum:0x0055fd02eedfe0 @num=30>
irb(main):012:0> num2 = MyNum.new(10)
=> #<MyNum:0x0055fd02ee3ab8 @num=10>
irb(main):013:0> num3 = MyNum.new(20)
=> #<MyNum:0x0055fd02ed6e08 @num=20>
irb(main):014:0> p [num1, num2, num3].sort.map{|n| n.num }
[10, 20, 30]
=> [10, 20, 30]

以下, 解説より抜粋.

  • sort メソッドは、配列の要素に対して <=> 演算子を使用して比較する
  • 数値や文字列などの既存のオブジェクトに関しては, <=> 演算子が定義されているので, sortメソッドを使用することが出来る
  • 設問の MyNum クラスのオブジェクトには <=> を再定義する必要がある
irb(main):017:0> 1 <=> 2
=> -1
irb(main):018:0> 1 <=> 1
=> 0
irb(main):019:0> 2 <=> 1
=> 1
irb(main):020:0> 'a' <=> 'b'
=> -1
irb(main):021:0> 'a' <=> 'a'
=> 0
irb(main):022:0> 'x' <=> 'a'
=> 1

Q29. Object#equal?

以下の結果を出力するコードとして __(1)__ に当てはまるものを選択する.

# コード
var1 = __(1)__
var2 = __(1)__

puts var1.equal?(var2)

# 実行結果
true

3. :hello

以下, irb による実行例.

irb(main):001:0> var1 = :hello
=> :hello
irb(main):002:0> var2 = :hello
=> :hello
irb(main):003:0> 
irb(main):004:0* puts var1.equal?(var2)
true
=> nil

以下, 解説より抜粋.

  • Object#equal? はオブジェクト同士の同一性判定用のメソッドで, 引数で指定したオブジェクトがレシーバ自身であれば true を返す
  • 内部的には Object#object_id が一致することを調べる
  • :hello はシンボルオブジェクトを表しており, 文字列が同じであれば同じオブジェクトを参照する

Q30. 多重代入

以下のコードを実行したときの結果として正しいものを選択する.

# コード
a, b = [1, 2, 3]
p a
p b
1
2

以下, irb による実行例.

irb(main):001:0> a, b = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> p a
1
=> 1
irb(main):003:0> p b
2
=> 2

以下, 解説より抜粋.

  • Ruby は多重代入をサポートしている為, 一度に複数の変数に代入することが出来る
  • 左辺の変数の数より, 右辺の値の数が多い場合は残りの値を破棄する

以下, こちらの記事を参考に Ruby の多重代入をいくつか試してみた.

# 右辺がカンマ区切りで複数ある場合には配列に変換される
irb(main):001:0> a = 1, 2
=> [1, 2]
irb(main):002:0> a.class
=> Array

# 右辺と左辺がカンマ区切りで区切られている場合, 配列に変換された上で, 左辺の各変数に右辺の各要素が代入される
irb(main):003:0> a, b = 1, 2
=> [1, 2]
irb(main):004:0> p a.class
Fixnum
=> Fixnum
irb(main):005:0> p b.class
Fixnum
=> Fixnum

# 右辺の要素の数が左辺の要素よりも少ない場合, 左辺の残りの要素には nil が代入される
irb(main):006:0> a, b = 1
=> 1
irb(main):007:0> p a
1
=> 1
irb(main):008:0> p b
nil
=> nil

# 右辺の要素の数が多い場合, 左辺の余った要素は無視される
irb(main):009:0> a, b = 1, 2, 3
=> [1, 2, 3]
irb(main):010:0> p a
1
=> 1
irb(main):011:0> p b
2
=> 2

# 変数に * を付与すると, 右辺の残りの要素を全て配列として代入される
irb(main):012:0> a, *b = 1, 2, 3
=> [1, 2, 3]
irb(main):013:0> p a
1
=> 1
irb(main):014:0> p b
[2, 3]
=> [2, 3]

フムフム.