何をチェックするために@some_var
、私はやっています
if @some_var.class.to_s == 'Hash'
私がいるかどうかを確認するために、よりエレガントな方法があると確信して@some_var
いますHash
かArray
。
[result_hash, another_result_hash]
かsingle_result_hash
?そのAPIを作成した人は誰もうまくいきませんでした!
何をチェックするために@some_var
、私はやっています
if @some_var.class.to_s == 'Hash'
私がいるかどうかを確認するために、よりエレガントな方法があると確信して@some_var
いますHash
かArray
。
[result_hash, another_result_hash]
かsingle_result_hash
?そのAPIを作成した人は誰もうまくいきませんでした!
回答:
あなたはただ行うことができます:
@some_var.class == Hash
または次のようなもの:
@some_var.is_a?(Hash)
「is_a?」に注意してください。クラスがオブジェクト祖先ツリーのどこかにある場合、メソッドはtrueです。例えば:
@some_var.is_a?(Object) # => true
上記は、@ some_varがObjectから派生したハッシュまたはその他のクラスのインスタンスである場合に当てはまります。したがって、クラスタイプを厳密に一致させる場合は、==またはinstance_of?メソッドはおそらくあなたが探しているものです。
is_a?
true
サブクラスに対しても返されるため、これは最良のオプションです。
@som_var.is_a? Hash
ActiveSupport::HashWithIndifferentAccess
はHashを継承しているため@some_var.is_a?(Hash)
、この場合もtrueを返します。(私は同じ質問とHashWithIndifferentAccessケースを持っていて、コメントから少し混乱しました...それで明確にしたいと思いました)
通常、ルビーでは、「タイプ」を探しているときに、「アヒルのタイプ」または「カモのようにいかがですか」が実際に必要です。特定のメソッドに応答するかどうかを確認します。
@some_var.respond_to?(:each)
:eachに応答するので、@ some_varを反復できます。
タイプを本当に知りたい場合、それがハッシュまたは配列の場合は、次のようにすることができます。
["Hash", "Array"].include?(@some_var.class) #=> check both through instance class
@some_var.kind_of?(Hash) #=> to check each at once
@some_var.is_a?(Array) #=> same as kind_of
sort
最初にそれを呼び出します。
["Hash", "Array"].include?(@some_var.class.to_s) #=> check both through instance class
実際には、変数が単なる指示ではなく、配列であるかハッシュであるかに応じて、異なる方法で動作することがよくあります。この場合、エレガントなイディオムは次のとおりです。
case item
when Array
#do something
when Hash
#do something else
end
で.class
メソッドを呼び出さないことに注意してくださいitem
。
オブジェクトが厳密にまたは拡張されているかどうかをテストする場合はHash
、次を使用します。
value = {}
value.is_a?(Hash) || value.is_a?(Array) #=> true
しかし、Rubyのダックタイピングの価値を高めるには、次のようにします。
value = {}
value.respond_to?(:[]) #=> true
value[:key]
構文を使用して特定の値にのみアクセスする場合に便利です。
発生
Array.new["key"]
することに注意してくださいTypeError
。