0

以下のコードに従ってください:

パートI

> h = { "a" => 100, "b" => 200 }
=> {"a"=>100, "b"=>200}
> h.default = "Go fish"
=> "Go fish"
> h["a"]
=> 100
> h["z"]
=> "Go fish"
> h.default = proc do |hash, key|
*   hash[key] = key + key
> end
=> #<Proc:0x208bee8@(irb):5>
> h[2]
=> #<Proc:0x208bee8@(irb):5>
> h["cat"]
=> #<Proc:0x208bee8@(irb):5>

パートII

> h = { "a" => 100, "b" => 200 }
=> {"a"=>100, "b"=>200}
> h.default_proc = proc do |hash, key|
*   hash[key] = key + key
> end
=> #<Proc:0x1e21df8@(irb):2>
> h[2]
=> 4
> h["cat"]
=> "catcat"

h[2] and h["cat"]で2つのコードに異なる出力を与える理由を見て驚いていますpart-I and part-II

誰か説明してもらえますか?

4

2 に答える 2

2

なんで?(哲学的)

s のハッシュが必要な場合はどうしますProcか? デフォルトProc to runProcに設定することはできません。これは、 to returnと区別する (簡単な) メカニズムがないためです。

s のマップはProc、単純なステート マシンまたは外部 DSL を実装するために使用される場合があります。

なんで?(テクニカル)

そのよう[]に書かれているからです:

VALUE
rb_hash_aref(VALUE hash, VALUE key)
{
    st_data_t val;

    if (!RHASH(hash)->ntbl || !st_lookup(RHASH(hash)->ntbl, key, &val)) {
        if (!FL_TEST(hash, HASH_PROC_DEFAULT) &&
            rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
            return RHASH_IFNONE(hash);
        }
        else {
            return rb_funcall(hash, id_default, 1, key);
        }
    }
    return (VALUE)val;
}

言うべきドキュメントとしてdefault

各キー ルックアップで実行される Proc にデフォルトを設定することはできません。

于 2013-01-13T14:20:32.850 に答える
2
  • Hash#default=そのようなキーがない場合に返される値を設定します。パート I でこれを proc に設定すると、それが返されます。
  • Hash#default_proc=そのようなキーがない場合は、proc がそれ自体とキーに対して呼び出されるように設定します。hash[2] = 2 + 2すると、hash[2]が返されます4hash["cat"] = "cat" + "cat"すると、hash["cat"]が返されます"catcat"
于 2013-01-13T14:26:17.697 に答える