RubyアソシエーションLevel 3

難易度は Level 1(やさしめ)〜Level 5(難関) の5段階です。

Ruby Silverのサンプル問題(本番形式・解説付き)

Ruby Silver(Rubyアソシエーション・Ruby Association Certified Ruby Programmer Silver(Ruby 3.1 対象))の出題形式を、実際の問題で確かめられます。ここに掲載する5問は、無料の会員登録で解ける模試 第1回(50問)の冒頭から抜粋したオリジナル問題です。当サイトは全150問を本番CBT準拠の形式で収録しており、この5問はそのごく一部にあたります。

設問1

`frozen_string_literal` の指定がない次のコードの出力はどれか。 ```ruby p [1 == 1.0, 1.eql?(1.0), "a".equal?("a")] ```

  • `[true, true, false]`
  • `[true, false, false]`(正解)
  • `[true, false, true]`
  • `[true, true, true]`

解説

`==` は値が等しいかを見るので、`1 == 1.0` は `true` です。`eql?` は型も同じでなければ真にならず、`1.eql?(1.0)` は `false` になります。`equal?` は同じオブジェクトかを見ます。`"a"` を2回書くと別のオブジェクトが作られるので、`false` です。そのため `[true, true, false]` や `[true, false, true]` にはならず、`[true, true, true]` のようにすべてが真になることもありません。

設問2

次のコードの出力はどれか。 ```ruby puts 2 + 3 * 2 ** 2 ```

  • `64`
  • `20`
  • `14`(正解)
  • `100`

解説

`**` が最も強く、次に `*`、最後に `+` の順で計算するので、`2 ** 2` が 4、`3 * 4` が 12、`2 + 12` で `14` になります。`20` は `(2 + 3) * 2 ** 2` の読み方で、足し算を先に計算した結果です。`64` は `(2 + 3 * 2) ** 2` の読み方で、べき乗を最後に回した結果です。`100` は `((2 + 3) * 2) ** 2` のように、左から順に計算した結果です。

設問3

次のコードの出力はどれか。 ```ruby x = p(1, 2) y = puts(3) p [x, y] ```

  • `1`、`2`、`3`、`[[1, 2], nil]` の順に表示される(正解)
  • `1`、`2`、`3`、`[[1, 2], 3]` の順に表示される
  • `1`、`2`、`3`、`[nil, nil]` の順に表示される
  • `[1, 2]`、`3`、`[[1, 2], nil]` の順に表示される

解説

`p` は引数を1行ずつ表示し、引数が2つ以上なら引数の配列 `[1, 2]` を返します。`puts` は表示した後で `nil` を返すので、最後の行は `[[1, 2], nil]` です。`[[1, 2], 3]` のように表示した値が戻るのは `p` だけの性質で、`puts` は違います。`[nil, nil]` は、`p` も `nil` を返すと考えた結果になります。また `p(1, 2)` は `[1, 2]` を1行にまとめず、2行に分けて出します。

設問4

次のコードの出力はどれか。 ```ruby a, *b, c = 1, 2, 3, 4 p [a, b, c] ```

  • `[1, [2], 3]`
  • `[1, [2, 3, 4], nil]`
  • `[1, [], 4]`
  • `[1, [2, 3], 4]`(正解)

解説

`*b` は、`a` と `c` に割り当てた残りの値を配列で受け取ります。`a` が 1、`c` が最後の 4、`b` が間の `[2, 3]` です。`[1, [2, 3, 4], nil]` は、`b` が余りを全部取る読み方ですが、`*` の後ろに変数があるときは最後の値が `c` に入ります。`[1, [2], 3]` は、値の数を数え違えた結果になります。`[1, [], 4]` は、`b` が空になる読み方で、値が 2 つしか無いときの結果です。

設問5

次のコードの出力はどれか。 ```ruby class Animal; def speak; 'noise'; end; end class Dog < Animal; def speak; 'woof'; end; end class Cat < Animal; end p [Animal.new, Dog.new, Cat.new].map(&:speak) ```

  • `["noise", "woof", "noise"]`(正解)
  • `["noise", "woof", nil]`
  • `["noise", "noise", "noise"]`
  • `["noise", "woof", "woof"]`

解説

`Dog` は `speak` を上書きしているので `woof` を返します。`Cat` は上書きしておらず、スーパークラス `Animal` のメソッドが使われるため `noise` です。`["noise", "woof", "woof"]` は、上書きが他のサブクラスにも及ぶと考えた結果です。`["noise", "woof", nil]` は、上書きしていないサブクラスのメソッドは `nil` を返すと考えた結果になります。`["noise", "noise", "noise"]` は、サブクラスの上書きが呼ばれないと考えた結果です。

続きは、会員登録なしでそのまま50問解けます。採点と解説つきで、上と同じ本物の問題です。

登録なしで50問解く