0

を微調整しているときにこのコードに遭遇しましたがghi、オブジェクトをオブジェクトに渡す意味がわかりませんALIASES[key] if /^\d+$/ === key次のコードの行を説明してくれる人はいますか?

ALIASES = Hash.new { |_, key|
  [key] if /^\d+$/ === key
}.update({...})

https://github.com/yangchenyun/ghi/blob/reading/lib/ghi.rb#L119-138

4

4 に答える 4

3

このコードは、存在しないキーがアクセスされたときに返されるデフォルト値を設定します。

この特定のケースでは、与えられたが整数の表現である場合、デフォルトはkey内で与えられたを返すように設定されています。ArraykeyString

hash = Hash.new do |_, key|
  [key] if /^\d+$/ === key
end

hash["foo"].inspect  # => nil
hash[123].inspect    # => nil
hash["123"].inspect  # => ["123"]

正規表現マッチングの例:

/^\d+$/ === 123     # => false
/^\d+$/ === "a123"  # => false
/^\d+$/ === "123a"  # => false
/^\d+$/ === "1.23"  # => false
/^\d+$/ === "123"   # => true

そして、デフォルト値の別の (より単純な) 例:

hash = Hash.new { |_, key| "this key does not exist" }

hash["foo"]           # => "this key does not exist"
hash["foo"] = "bar"
hash["foo"]           # => "bar"

ブロック パラメーターの命名について: 最初のパラメーターには好きな名前を付けることができますが、一部の開発者は未使用のブロック operator に名前を付けたいと考えています_。このようにすると、このパラメーターを気にしないことが一目でわかります。

于 2012-12-03T16:42:24.593 に答える
2

これ[key] if /^\d+$/ === keydefault_procです。ハッシュにキーが見つからない場合は常に実行れます。「123」が既存のキーでない場合ALIASES["123"]に返されます。["123"]

于 2012-12-03T16:41:06.697 に答える
0

こちらの Hash::new ドキ​​ュメントをご覧ください。それは言います:

新しい空のハッシュを返します。このハッシュがその後、ハッシュ エントリに対応しないキーによってアクセスされた場合、返される値は、ハッシュの作成に使用された new のスタイルによって異なります。ブロックが指定されている場合、それはハッシュ オブジェクトとキーで呼び出され、デフォルト値を返す必要があります。

したがって、「_」は設定されるオブジェクトの値であり、作成者は気にしません。中央の行は、キーが数字のみで構成されているかどうかを確認し、そうでない場合は、キー値をこのキー値を持つ配列に割り当てます。キーが数字のみで構成されている場合は無視されます。

Ruby の Regexp#=== はRegexp#=~ の単なるエイリアスです。

ただ注意してください - これは恐ろしく、読めないコードです。そのようなことを書くことができるからといって、そうすべきだというわけではありません。刺激を受けないでください。

于 2012-12-03T16:41:53.597 に答える
0

Hash::new の Ruby ドキュメントからの抜粋を次に示します。

obj が指定されている場合、この単一のオブジェクトがすべてのデフォルト値に使用されます。ブロックが指定されている場合、それはハッシュ オブジェクトとキーで呼び出され、デフォルト値を返す必要があります。必要に応じて、値をハッシュに格納するのはブロックの役割です。

あなたの場合、キーが見つからないときに返されるデフォルト値を定義するブロックです。この場合、キーが指定された正規表現/^\d+$/に一致する場合にのみそれを返します。これ[key]は、配列内で返されることを意味します。

于 2012-12-03T16:42:29.237 に答える