Ruby技術者認定試験 Silver について4
🔳Array#each_cons(cnt)
はself
からcnt
個ずつ要素を取り出しブロックに渡します。ブロック引数には配列で渡されます。
取り出す要素は、[要素1, 要素2, 要素3], [要素2, 要素3, 要素4] ...
と1つづ前に進みます。
似たメソッドにArray#each_slick(cnt)
があります。
以下が、それぞれの実行結果です。
(1..10).each_cons(3) {|arr| p arr }
# <実行結果>
# [1, 2, 3]
# [2, 3, 4]
# [3, 4, 5]
# [4, 5, 6]
# [5, 6, 7]
# [6, 7, 8]
# [7, 8, 9]
# [8, 9, 10]
(1..10).each_slice(3) {|arr| p arr }
# <実行結果>
# [1, 2, 3]
# [4, 5, 6]
# [7, 8, 9]
# [10]
問題
次のコードを実行するとどうなりますか
arr = (1..30).to_a
container = []
arr.each_cons(7) do |i|
container << i
end
p container.length
24
と表示される
5
と表示される
7
と表示される
0
と表示される
>> arr = (1..30).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
>> container =
=>
>>
?> arr.each_cons(7) do |i|
?> container << i
>> end
=> nil
>>
?> p container.length
24
=> 24
🔳
v1 = 1 - 1 == 0
v2 = v1 || raise RuntimeError
puts v2 && false
1行目を処理した後のv1
はtrue
になります。
2行目では、||
の優先順位が高いため、v1 || raise
が評価されます。
しかし、後ろにRuntimeError
があるため、シンタックスエラーになっています。
この挙動を回避するには、以下の3つの方法があります。
ex1)
v2 = v1 or raise RuntimeError
ex2)
v2 = v1 || raise(RuntimeError)
ex3)
v2 = v1 || (raise RuntimeError)
そのほかの演算子の優先順位はRubyリファレンスを参照してください。
問題
次のコードを実行するとどうなりますか。
v1 = 1 - 1 == 0
v2 = v1 || raise RuntimeError
puts v2 && false
シンタックスエラーとなる
実行時にエラーとなる
true
と表示される
false
と表示される
🔳Array(3)
はArray([3])
と宣言したことと同じ意味になります。この時ブロックの内容は無視されます。
問題では、Fixnum
にupcase
メソッドが定義されていないためエラーになります。
Array#first
は配列の先頭要素を取得します。
Array.new(3){"a"}
は要素数3の配列を作成し、ブロックの値でそれぞれ初期化します。Array.new(3, "a")
は要素数3の配列を作成し、全要素を"a"
で初期化します。この時、"a"
は同一のオブジェクトを参照しています。
String#upcase
は非破壊メソッドなので、selfの内容は変わりません。String#upcase!
は破壊メソッドなので、selfの内容が変わります。
問題
実行結果にある結果を得るように選択肢からコードを選べ
#実行結果
["A", "a", "a"]
arr = Array(3){"a"}
arr.first.upcase
p arr
arr = Array(3){"a"}
arr.first.upcase!
p arr
arr = Array.new(3){"a"}
arr.first.upcase
p arr
arr = Array.new(3){"a"}
arr.first.upcase!
p arr
期待値はキーが:price
と:tax
の値を配列です。
Hash#key
Hash#key
メソッドは引数を1つ取ります。返却値は引数に合った値を持つキーです。 もし引数の値を持つキーがなければ、nil
を返します。 ```ruby hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.key 100 # :price が表示される
p hash.key 150 # nil が表示される
- `Hash#values`
`Hash#values`メソッドは引数を取りません。返却値はレシーバーの値を集めた配列です。
```ruby
hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.values # [100, 200, "2018/09/20", 0.8] が表示される
Hash#values_at
Hash#values_at
メソッドは可変長引数を取ります。返却値は引数に指定したキーの値を集めた配列です。 ```ruby hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.values_at(:price, :tax) # [100, 0.8] が表示される
- `Hash#[]`
`Hash#[]`メソッドは引数を1つ取ります。返却値は引数に合ったキーが持つ値です。
もし引数のキーがハッシュになければ、`nil`を返します。
```ruby
hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.[](:price) # 100 が表示される
p hash.[](:bazz) # nil が表示される
この問題では、複数のキーを指定し対応する値を配列にするvalues_at(:price, :tax)
が正解です。
問題
次のプログラムの期待値を得られるように正しいメソッドを選択肢から選んでください。
hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.__(1)__
期待値
[100, 0.8]
key(:price, :tax)
values(:price, :tax)
values_at(:price, :tax)
[](:price, :tax)
期待値はキーが:price
と:tax
の値を配列です。
Hash#key
Hash#key
メソッドは引数を1つ取ります。返却値は引数に合った値を持つキーです。 もし引数の値を持つキーがなければ、nil
を返します。 ```ruby hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.key 100 # :price が表示される
p hash.key 150 # nil が表示される
- `Hash#values`
`Hash#values`メソッドは引数を取りません。返却値はレシーバーの値を集めた配列です。
```ruby
hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.values # [100, 200, "2018/09/20", 0.8] が表示される
Hash#values_at
Hash#values_at
メソッドは可変長引数を取ります。返却値は引数に指定したキーの値を集めた配列です。 ```ruby hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.values_at(:price, :tax) # [100, 0.8] が表示される
- `Hash#[]`
`Hash#[]`メソッドは引数を1つ取ります。返却値は引数に合ったキーが持つ値です。
もし引数のキーがハッシュになければ、`nil`を返します。
```ruby
hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.[](:price) # 100 が表示される
p hash.[](:bazz) # nil が表示される
この問題では、複数のキーを指定し対応する値を配列にするvalues_at(:price, :tax)
が正解です。
問題
次のプログラムの期待値を得られるように正しいメソッドを選択肢から選んでください。
hash = {price: 100, order_code: 200, order_date: "2018/09/20", tax: 0.8}
p hash.__(1)__
期待値
[100, 0.8]
key(:price, :tax)
values(:price, :tax)
values_at(:price, :tax)
[](:price, :tax)