Ruby技術者認定試験 Silver について3

🔳

Date#to_s2015-01-05形式で日付を出力します。

次の表が選択肢で使用されているフォーマット文字列の意味になります。

フォーマット文字列 意味
%y 西暦の下2桁(00-99)
%Y 西暦を表す数(9999)
%m 月を表す数字(01-12)
%M 分(00-59)
%d 日(01-31)
%D 日付(%m/%d/%y)

問題

Date.today.to_sと同じ動作をするコードを選びなさい

選択肢

Date.today.strftime("%y/%m/%d")

選択肢

Date.today.strftime('%y-%m-%d')

選択
選択肢

Date.today.strftime("%Y/%m/%d")

選択肢

Date.today.strftime("%Y-%m-%d")

>> Date.today.strftime("%y/%m/%d")
=> "19/08/26"
>>
?>
?> Date.today.strftime('%y-%m-%d')
=> "19-08-26"

 

 

 

🔳以下の表が、問題コードで使用されているメソッド一覧です。

メソッド 説明
String#concat(other) selfotherを繋げます
String#reverse 文字列の並びを反転します このメソッドは破壊的メソッドです
String#index(pattern, pos) 文字列のpos番目からpatternを検索し、最初に見つかった位置を返します

問題のコードを1行ずつ実行すると以下のようになります。

1: a = "Ruby"
2: b = " on Rails"
3: a.concat b
4: a.reverse!
5: p a.index("R", 1)

# <実行結果>
# 3: p a.concat b #=> "Ruby on Rails"
# 4: p a.reverse! #=> "sliaR no ybuR"
# 5: p a          #=> "sliaR no ybuR"

問題

次のコードを実行するとどうなりますか

a = "Ruby"
b = " on Rails"
a.concat b
a.reverse!
p a.index("R", 1)
選択
選択肢

4が表示される

選択肢

8が表示される

選択肢

3が表示される

選択肢

9が表示される

 

 🔳s..es...eRangeクラスの定義です。
..は終端を含み、...は終端を含みません。

Enumerator#with_index(offset)は要素にインデックスを添えてを繰り返します。
インデックスはoffsetから開始します。

問題

次のコードを実行するとどうなりますか

(10..15).to_a.map.with_index(1) do |elem, i|
  puts i
end
選択
選択肢
1
2
3
4
5
6
選択肢
0
1
2
3
4
5
選択肢
6
5
4
3
2
1
選択肢
5
4
3
2
1
0

🔳

Array#-selfから引数に含まれる要素を取り除きます。
引数にselfに含まれない要素がある場合は、無視されます。

問題では、a2a1と同じ[2, 3]が含まれるので、[2, 3]を除く[1]が表示されます。

問題

次のコードを実行するとどうなりますか

a1 = [1,2,3]
a2 = [4,2,3]

p a1 - a2
選択肢
[1, 2, 3, 4]

と表示される

選択肢
[2, 3]

と表示される

選択
選択肢
[1]

と表示される

選択肢
[1, 2, 3, 4, 2, 3]

と表示される

 

 

🔳Numeric#step(limit, step)selfからstepずつ加算し、limitまでをブロックに渡します。

問題の1.step(5,1)は「1から1ずつ加算し、5までの数値」という意味になります。

問題

次のコードを実行するとどうなりますか

def hoge
  x = 0
  1.step(5,1) do |i|
    x += 1
  end
  puts x
end
hoge
選択肢

4が表示される

選択肢

5が表示される

選択
選択肢

例外が発生する

選択肢

0が表示される

 

 

🔳Hash#invertはキーと値を入れ替えます。
入れ替えの結果キーが重複した場合は、後に定義された方が優先されます。

Hash#invertの例

p ({a: 100, b: 100}).invert

# 実行結果
# {100 => :b}

問題

次のコードを実行するとどうなりますか

h = {a: 100, b: 100}
puts h.invert
選択肢

{100: a}

選択肢

{100: b}

選択
選択肢

[[100, :a],[100, :b]]

選択肢

 

🔳splat演算子(*)でハッシュを展開することが出来ます。
ハッシュはネストされた配列で表現出来ますので、splat(*)演算子ではその配列に対して展開を行います。

hash = {a: 100, b: 200}
p hash.to_a # [[:a, 100], [:b, 200]]と表示されます。

この問題は、次のように表示されるのが答えです。

[:a, 100]
[:b, 200]

問題

次のプログラムを実行するとどうなりますか

hash = {a: 100, b: 200}

def splat_hash(a, b)
  p a
  p b
end

splat_hash(*hash)
選択肢

次の内容が出力される。

{a: 100, b: 200}
{a: 100, b: 200}
選択肢

次の内容が出力される。

[100, :a]
[200, :b]
選択
選択肢

次の内容が出力される。

{a: 100}
{b: 200}
選択肢

次の内容が出力される。

[:a, 100]
[:b, 200]

 

🔳

| メソッド | 説明 |
Array#pop | selfの末尾より1要素を破壊的に取り出します(LIFO)。 |
Array#push | selfの末尾に引数の値を破壊的に追加します(LIFO)。 |
Array#unshift | selfの先頭へ引数の値を破壊的に追加します(FIFO)。引数が指定されていない場合は何もしません。|
Array#shift | selfの先頭より1要素を破壊的に取り出します(FIFO)。 |

問題のコードを順番に実行すると以下のような結果になります。

1: s = ["one", "two", "three"]
2: s.shift
3: s.shift
4: s.unshift
5: s.push "four"
6: p s

# <実行結果>
# 1: ["one", "two", "three"]
# 2: ["two", "three"]
# 3: ["three"]
# 4: ["three"]
# 5: ["three", "four"]

問題

次のコードを実行するとどうなりますか

s = ["one", "two", "three"]
s.shift
s.shift
s.unshift
s.push "four"
p s
選択肢

["three", "four"]と表示される

選択肢

[nil, "three", "four"]と表示される

選択肢

["one", "two", "three"]と表示される

選択
選択肢

["one", "two", "three", "four"]と表示される

 

🔳多重代入で左辺より右辺の数が少ない場合は、不足分にnilが代入されます。
また、ローカル変数は未定義であれば参照すると例外が発生しますがこの問題では定義はされているため参照しても問題ありません。nilが表示されます。

それぞれの代入は次のとおりです。
途中経過を「変数 => 数値」で記述します。

a, b = 0    # a => 0, b => nil
c, a = 1    # c => 1, a => nil
a, d = 1, 2 # a => 1, d => 2
b, c = 3    # b => 3, c => nil

この問題では[1, 3, nil, 2]が表示されます。

問題

次のプログラムを実行するとどうなりますか

a, b = 0
c, a = 1
a, d = 1, 2
b, c = 3

p [a, b, c, d]
選択肢

[nil, 1, 2, 3]と表示される

選択肢

[2, 3, 1, nil]と表示される

選択肢

[nil, 3, 1, 2]と表示される

選択
選択肢

[1, 3, nil, 2]と表示される

 

🔳

メソッド名 意味
find_allselect 各要素に対してブロックを評価した結果が、真である要素の配列を作成し返します
detect 要素に対してブロックを評価した結果が、最初に真になった要素を返します
collectmap 各要素に対してブロックを評価した結果を配列に格納し返します

問題

Arrayクラスでfind_allと同じ動作をするメソッドを選びなさい

選択肢

select

選択
選択肢

detect

選択肢

collect

選択肢

map

 

🔳Stringappendメソッドはありません。
文字列を結合するには、String<<を用います。

問題

次のコードを実行するとどうなりますか

a = "Ruby"
b = " on Rails"
a.append b
a.reverse
p a.index("R", 1)
選択肢

8が表示される

選択肢

エラーが発生する

選択
選択肢

4が表示される

選択肢

nilが表示される

 

🔳Enumerable#selectはブロックの戻り値がtrueになる要素を配列にして返します。
レシーバーをすべて走査して繰り返しを終了します。

配列の長さは10ですので、ブロックの戻り値がtrueかを問わず10が表示されます。

問題

次のプログラムを実行するとどうなりますか

$val = 0

class Count
  def self.up
    $val = $val + 1
    $val == 3 ? true : false
  end
end

[*1..10].select do
  Count.up
end

p $val
選択
選択肢

1が表示される

選択肢

0が表示される

選択肢

10が表示される

選択肢

3が表示される

 

🔳

問題の例外クラスを正しく捕捉できる選択肢は次のとおりです。

begin
  # `KeyError`と`StopIteration`が発生する処理
rescue KeyError

rescue StopIteration

end

begin
  # `KeyError`と`StopIteration`が発生する処理
rescue KeyError, StopIteration

end

begin
  # `KeyError`と`StopIteration`が発生する処理
rescue *[KeyError, StopIteration]

end

複数の例外クラスを捕捉するには代表的なものは3つです。

  1. rescue節を捕捉したい例外クラスだけ記述する
  2. rescue節で例外クラスをすべて記述する
  3. 先の選択肢と同じですが、配列で指定してsplat演算子(*)で展開する

splat演算子(*)はブロック(do〜end)のように単体では使うことは出来ません。
配列の内容を並び順に展開してくれます。
例えば、メソッドの引数が3つで配列のサイズが3のときにsplat演算子(*)は次のように作用します。

array = [:a, :b, :c]

def alphabet(a, b, c)
  puts a
  puts b
  puts c
end

alphabet(*array) # 配列の展開して、あたかも引数にひとつずつ指定するように作用します
# 出力は次の通り
# a
# b
# c

問題

KeyErrorStopIterationを捕捉するプログラムを選択肢から選んでください。

選択肢
begin
  # `KeyError`と`StopIteration`が発生する処理
rescue KeyError

rescue StopIteration

end
選択
選択肢
begin
  # `KeyError`と`StopIteration`が発生する処理
rescue KeyError, StopIteration

end
選択
選択肢
begin
  # `KeyError`と`StopIteration`が発生する処理
rescue [KeyError, StopIteration]

end
選択肢
begin
  # `KeyError`と`StopIteration`が発生する処理
rescue *[KeyError, StopIteration]

end