首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将哈希表与局部变量的值匹配?

如何将哈希表与局部变量的值匹配?
EN

Stack Overflow用户
提问于 2018-09-10 03:15:32
回答 1查看 436关注 0票数 2
代码语言:javascript
复制
> (define h #hash((a . 11) (b . 0)))
> (define (f h key)
    (match h
      [(hash-table (key value)) value]
      [_ 'do-something-else]))
> (f h 'a)
'do-something-else  ;; expect 11

如何修改match模式,以便上面的函数返回与(hash-ref h key 'do-something-else)相同的

一个问题似乎是match是自动引用key,因此它实际上与'key匹配,而不是key局部变量的值。第二个问题是,match hash-table似乎希望匹配整个哈希表,而不是仅仅匹配一个键值对。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-10 11:49:09

如何复制hash-ref的行为

要复制hash-ref的行为,您需要做两件事:

(1)使用key模式,该模式只匹配与参数key值相等的内容。您可以使用 pattern来完成这一任务。

代码语言:javascript
复制
(hash-table ((== key) value))

(2)如果有key以外的其他条目,则匹配哈希表。您可以通过添加_ ...来匹配其他条目来做到这一点。

代码语言:javascript
复制
(hash-table ((== key) value) _ ...)

在以下方面:

代码语言:javascript
复制
(define (f h key)
  (match h
    [(hash-table ((== key) value) _ ...) value]
    [_ 'do-something-else]))

使(f h key)的行为像(hash-ref h key 'do-something-else)一样。

为什么你的第一次尝试没有成功

你的模式:

代码语言:javascript
复制
(hash-table (key value))

不自动引用key,使其字面上与'key匹配。相反,它匹配只有一个条目的任何哈希表:

代码语言:javascript
复制
> (match (hash 'anything-goes 11)
    [(hash-table (key value)) value]
    [_ 'do-something-else])
11

这是因为key被解释为模式,标识符被解释为模式匹配任何东西。如果您将它命名为其他东西并在身体中使用它,您可以更清楚地看到这一点:

代码语言:javascript
复制
> (define (f h key-arg)
    (match h
      [(hash-table (key-pat value))
       (printf "key-arg = ~v\n" key-arg)
       (printf "key-pat = ~v\n" key-pat)
       value]))
> (f (hash 'anything-goes 11) 'a)
key-arg = 'a
key-pat = 'anything-goes
11

当您编写“碰巧”具有与局部变量相同名称的标识符模式时,它会对其进行阴影,就像下面的示例所示:

代码语言:javascript
复制
> (let ([x "local variable"])
    (match (list 1 2 3)
      [(list 1 2 x)
       x]))
 3

模式中的x匹配任何东西,因此它与3匹配。模式隐藏了x,因此当主体使用x时,它引用的是3,而不是局部变量。由于这种阴影,局部变量从未实际使用过。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52250601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档