難易度は 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問解く