3

私は3つのハッシュを持っています:

a = {key:"value"}
b = {"key"=>"value"}
c = {:key=>"value"}

そして、これらの結果:

a.has_key?("key") # => false
b.has_key?("key") # => true
c.has_key?("key") # => false

私の質問は次のとおりです。

  • なんで?この動作は何ですか?
  • aを取得し、それらすべてに同じ構文を使用しbc返すにはどうすればよいですか?true
4

3 に答える 3

18

文字列があり、記号があります。文字列はシンボルではありません。

これらのハッシュには、キーとしてシンボルが含まれています。

{key: "value"}
{:key => "value"}

このハッシュには、キーとして文字列が含まれています。

{"key"=>"value"}

そのため、テストはそのように動作します。

Rails にはHashWithIndifferentAccessと呼ばれる Hash のラッパーがあります。それらのいずれかを持っている場合、文字列または記号のいずれかで値にアクセスできます。しかし、通常のハッシュには違いがあります。

require "active_support/core_ext"

h = {key: "value"}.with_indifferent_access

h.has_key?(:key) # => true
h.has_key?("key") # => true
于 2013-11-06T10:45:24.613 に答える
2

ハッシュを割り当てている間に観察すると、IRB では次のようになります。

2.0.0p247 :014 > a = {key:"values"}
 => {:key=>"values"} 
2.0.0p247 :015 > b = {"key" => "values"}
 => {"key"=>"values"} 
2.0.0p247 :016 > c = {:key => "value"}
 => {:key=>"value"} 

代入に使用される構文を除いて、aとは同じであることがわかります。cに使用される構文cは、古い構文だと思います。

a = {key:"values"} 

最新の Ruby バージョンで導入された構文です。hashaとの両方cで、キーはaシンボルです。

Ruby シンボルと文字列の違い」では、文字列とシンボルの違いについて説明していますが、ハッシュbではキー値は文字列です。どうやらその値は「キー」です。主な違いは、 hash の key の値bは変更可能ですが、 hash の場合は true ではないことですa

于 2013-11-06T11:04:58.187 に答える
0

:keyハッシュac. _

a = {key: "value"}
b = {"key" => "value"}
c = {:key => "value"}
a.has_key? :key # => true
b.has_key? :key # => false
c.has_key? :key # => true

{key:"value"}と同等{:key=>"value"}です。

于 2013-11-06T10:43:42.967 に答える