2

値の場合:

myhash['first_key']['second_key']

存在する場合は、取得する必要があります。しかし、'second_key'にはまったく存在しない可能性があり、存在しない場合my_hashにその行で例外をスローしたくありません。

今、私はすべてを醜い条件でラップしています:

if myhash['first_key'].present? and myhash['first_key']['second_key'].present?
  ...
end

きっともっとシンプルなものがあるに違いない。

4

6 に答える 6

8

いつでも使用できますtry

hsh.try(:[], 'first_key').try(:[], 'second_key')

参考までに: これらのチェックを多数行っている場合は、コードをリファクタリングして、これらの状況を回避することをお勧めします。

于 2013-09-16T19:36:57.487 に答える
4

このきちんとしたクリーンなソリューションを試してください。ハッシュのデフォルト値:

h = Hash.new( {} ) # sets a hash as default value

今、あなたが好きなことをしてください:

h[:some_key] # => {}
h[:non_existent_key][:yet_another_non_existent_key] # => nil

良い?

すでに入力されている既存のハッシュがあるとします。

h = { a: 1, b: 2, c: 3 }

したがって、新しいハッシュを返すようにデフォルトを設定するだけです。

h.default = {}

そして、あなたは再び行きます:

h[:d] # => {}
h[:d][:e] # => nil
于 2013-09-16T19:54:46.753 に答える
1

優れたHashie::Mashを紹介します

例:

mash = Hashie::Mash.new

# Note: You used to be able to do : `mash.hello.world` and that would return `nil`
# However it seems that behavior has changed and now you need to use a `!` :

mash.hello!.world # => nil  # Note use of `!`


mash.hello!.world = 'Nice'  # Multi-level assignment!


mash.hello.world # => "Nice"
# or
mash.hello!.world # => "Nice"
于 2013-09-17T06:29:27.063 に答える
0

ハッシュを処理する前に、いくつかのデフォルト値を設定できます。何かのようなもの:

myhash[:first_key] ||= {}

if myhash[:first_key][:second_key]
  # do work
end
于 2013-09-16T19:54:38.707 に答える