[解決済み] Ruby - 多次元ハッシュへのアクセスとnilオブジェクトへのアクセス回避 [duplicate]
質問
重複の可能性があります。
ルビー IF文の中のNils
ネストされたパラメータハッシュのnilでメソッドを呼び出すことを避けるためのきれいな方法はありますか?
このようなハッシュにアクセスしようとするとします。
my_hash['key1']['key2']['key3']
key1、key2、key3がハッシュ内に存在する場合は良いのですが、例えばkey1が存在しない場合はどうでしょうか?
その場合、私は
NoMethodError: undefined method [] for nil:NilClass
. そして誰もそれを好まない。
今までは、このように条件をつけて対処していました。
if my_hash['key1'] && my_hash['key1']['key2']
...
これは適切なのでしょうか、他にRubiestな方法はないのでしょうか?
どのように解決するのですか?
いろいろなアプローチがあります。
Ruby2.3以降を使用している場合は ディグ
my_hash.dig('key1', 'key2', 'key3')
多くの人は、プレーンなルビーにこだわり、ルビーにチェーンして
&&
ガードテストを連鎖させます。
stdlib を使うことができる ハッシュ#フェッチ も使えます。
my_hash.fetch('key1', {}).fetch('key2', {}).fetch('key3', nil)
ActiveSupport の #try メソッドを連鎖させるようなものもあります。
my_hash.try(:[], 'key1').try(:[], 'key2').try(:[], 'key3')
その他は と
myhash['key1'].andand['key2'].andand['key3']
ある人は 自己中心的なニルス は良いアイデアだと思う人もいます (ただし、これをやっているのを見つけたら、誰かに追い詰められて拷問されるかもしれません)。
class NilClass
def method_missing(*args); nil; end
end
my_hash['key1']['key2']['key3']
を使うことができます。 Enumerable#reduce (またはaliases inject)を使ってください。
['key1','key2','key3'].reduce(my_hash) {|m,k| m && m[k] }
あるいは、Hashを拡張するか、ネストされたルックアップ・メソッドを持つターゲット・ハッシュ・オブジェクトだけを拡張することもできます。
module NestedHashLookup
def nest *keys
keys.reduce(self) {|m,k| m && m[k] }
end
end
my_hash.extend(NestedHashLookup)
my_hash.nest 'key1', 'key2', 'key3'
ああ、それから、どうして もしかしたら モナドを忘れてはいけません。
Maybe.new(my_hash)['key1']['key2']['key3']
関連
-
[解決済み] Rubyでnil値をマッピングして削除する方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み】PHPパスワードのハッシュとソルトの安全性について
-
[解決済み] Gemfileでrubygemを指定するときの~>と>=の違いは何ですか?
-
[解決済み] JSONファイルへの正しい書式での書き込み方法
-
[解決済み] 今月の名前(Date.today.monthをnameに変換)。
-
[解決済み] Rubyで文字列が正規表現にマッチするかどうかをチェックする最も速い方法?
-
[解決済み] raise "foo"`と`raise Exception.new("foo")` の違いは何ですか?
-
[解決済み] FactoryGirlのbuildメソッドとcreateメソッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ...』の違い (ダブルドット) と '...' の違い?(トリプルドット)の違いについて教えてください。
-
[解決済み] Gemfileでrubygemを指定するときの~>と>=の違いは何ですか?
-
[解決済み] Rubyで空のファイルを作成する:"touch "と同等?
-
[解決済み] Ruby文字列のgsubメソッドとsubメソッドの違いについて
-
[解決済み] rubyのinjectはreduceと同じ意味ですか?
-
[解決済み] 文字列を DateTime に変換する
-
[解決済み] 文字列内の複数の空白と改行を削除する
-
[解決済み] ランダムなブール値を返す最良の方法
-
[解決済み] FactoryGirlのbuildメソッドとcreateメソッドの違いは何ですか?
-
[解決済み] Railsのtry for hashesに相当する安全なナビゲーション