Ruby技術者認定試験 Silver について3
🔳
Date#to_s
は2015-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) |
self にother を繋げます |
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..e
やs...e
はRange
クラスの定義です。..
は終端を含み、...
は終端を含みません。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
に含まれない要素がある場合は、無視されます。
問題では、a2
にa1
と同じ[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_all , select |
各要素に対してブロックを評価した結果が、真である要素の配列を作成し返します |
detect |
要素に対してブロックを評価した結果が、最初に真になった要素を返します |
collect , map |
各要素に対してブロックを評価した結果を配列に格納し返します |
問題
Array
クラスでfind_all
と同じ動作をするメソッドを選びなさい
select
detect
collect
map
🔳String
にappend
メソッドはありません。
文字列を結合するには、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つです。
rescue
節を捕捉したい例外クラスだけ記述するrescue
節で例外クラスをすべて記述する- 先の選択肢と同じですが、配列で指定して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
問題
KeyError
とStopIteration
を捕捉するプログラムを選択肢から選んでください。
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