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行目を処理した後のv1trueになります。

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])と宣言したことと同じ意味になります。この時ブロックの内容は無視されます。
問題では、Fixnumupcaseメソッドが定義されていないためエラーになります。

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)