基本説明
HashやArray(配列)クラスのオブジェクトのメソッドを複数学べる良問があったので共有します。
メソッッド名 | 説明 | 戻り値 | 対応オブジェクト | 破壊的? |
---|---|---|---|---|
reject | 要素の数だけ繰り返しブロックを実行、ブロックの戻り値が真の要素を除き、新しい配列(かハッシュ)を返す | 偽になった新しい配列(かハッシュ) | Array, Hash | FALSE |
delete_if | 要素の数だけ繰り返しブロックを実行、ブロックの戻り値が真になった要素を削除 | レシーバ自身 | Array, Hash | TRUE |
delete | 配列:引数と同じ要素を探して、すべて削除 / ハッシュ:引数(key)と同じkeyを探して、keyとvalueを削除 | レシーバ自身, 要素見つからない場合はnil | Array, Hash, String | TRUE |
remove | HashやArray(配列)クラスにそんなメソッドは無い | - | - | |
remove_all | HashやArray(配列)クラスにそんなメソッドは無い | - | - | |
clear | 要素を全て削除する | レシーバ自身 | Array, Hash, String | TRUE |
オブジェクト自身(レシーバ)の内容を変えてしまうものを破壊的メソッドと呼ぶ。
例題1
出力結果が
{}
になる、過程は?(1〜5の中から、2つ選んでください)
h = {:foo => 1, :bar => 2}
# 1 : h.reject {|k,v| true} # NG
# 2 : h.delete_if {|k,v| true} # OK
# 3 : h.delete(:all) # NG
# 4 : h.remove_all # NG ERROR
# 5 : h.clear # OK
p h
- rejectは非破壊メソッドなのでNG
- delete(:all)と指定できないのでNG
- remove_allなんてメソッドは無いのでNG
- ActiveRecordでは削除系インスタンスメソッドとして存在します
RUBY技術者認定試験 公式ガイド (ITpro BOOKs) 157p 問題24より抜粋
例題2
出力結果が
[1, 3, 1, 3, 1, 3]
になる、過程は?(1〜5の中から、2つ選んでください)
ary = [1,2,3,1,2,3,1,2,3]
# 1:正解(破壊的メソッド)
# ary.delete(2)
# 2:正解(破壊的メソッド)
# ary.delete_if {|x| x == 2}
# 3 破壊的メソッドなら変わってた
# ary.reject {|x| x == 2}
# 4 エラー 存在しない
# ary.remove(2)
# 5 エラー 引数取らない ブロック処理するメソッド wrong number of arguments (given 1, expected 0) (ArgumentError)
# ary.reject(2)
p ary
実行結果は以下でサクッと試せます
Online Ruby Editor and IDE - Fast, Powerful, Free - Repl.it