ジョギング
- お昼に香椎浜 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]
フムフム.