【问题标题】:Why Symbol in clojure can be used as Functions? [duplicate]为什么 Clojure 中的 Symbol 可以用作函数? [复制]
【发布时间】:2014-01-23 15:37:44
【问题描述】:

我推荐你看这个短代码:

('a 1)
;==> nil
('a 1 2)
;=>2

为什么符号a在这种情况下可以用作函数?

【问题讨论】:

  • 我完全理解符号解析在 clojure 中是如何工作的。但我不明白为什么一个符号(绑定我们的未绑定)表现得像一个函数
  • 我检查了这两个帖子,我发现符号和关键字可以用作在地图中执行查找的函数。但是为什么上面的代码可以工作,因为它不应该
  • 为什么?最简单的答案是因为 clojure.lang.Symbol 实现了 IFn 接口。以这种方式使用它的规则是什么?请参阅 Chiron 的上述链接。为什么他们选择让符号表现得那样?为方便起见。
  • @user3228423 是的,在您的示例中,1 是地图,2 是“未找到”默认值,只要 1 不是地图,则返回未找到的 2
  • 如果您想了解这种行为,请查看get。用作函数的符号有效地调用 get,并且 get 将任何东西作为第一个 arg,如果它无法从中获取某些东西,则简单地返回默认值。 (get Double/NaN :a :default) => :默认

标签: clojure symbols


【解决方案1】:

它允许您以良好的语法查找以符号为键的地图。

以下是等价的:

('a my-hash-map)
(get my-hash-map 'a)  ; returns value associated with 'a or nil if not present

为了更方便,您还可以提供默认值作为可选的第二个参数:

('a my-hash-map 42)  ; returns 42 if my-hash-map does't have the key 'a

至于你的例子, ('a 1) 返回 nil 因为 (get 1 'a) 返回 nil em> 和 ('a 1 2) 返回提供的默认值 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2017-05-15
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多