代码之家  ›  专栏  ›  技术社区  ›  Belun

有人能解释一下这个代码吗?

  •  2
  • Belun  · 技术社区  · 14 年前
    1: user=> (def some-account {:number :any­-number :balance :any­-balance :bank :any­-bank})
    2: #'user/some-account
    3: user=> (contains? some-account :bank)
    4: true
    5: user=> (assoc some-account :owner :any-owner)
    6: {:owner :any-owner, :number :any­-number, :balance :any­-balance, :bank :any­-bank}
    7: user=> (contains? some-account :owner)
    8: false
    9: user=> (def some-account (assoc some-account :owner :any-owner))
    10: #'user/some-account
    11: user=> (contains? some-account :owner)
    12: true
    13: user=> (dissoc some-account :owner)
    14: {:number :any-­number, :balance :any­-balance, :bank :any-­bank}
    15: user=> (contains? some-account :owner)
    16: true
    

    有人能解释一下这个代码吗?

    为什么,之后 (assoc some-account :owner :any-owner) ,是吗 (contains? some-account :owner) 返回 false

    为什么,只有在 (def some-account (assoc some-account :owner :any-owner)) 返回 true ?

    为什么,之后 (dissoc some-account :owner) ,是吗 是的 ?

    我试着说

    5 回复  |  直到 14 年前
        1
  •  2
  •   Abhinav Sarkar    14 年前

    在Clojure中,所有的数据类型都是不可变的。因此 assoc 上的操作 some-account put 上的操作 java.util.Map 并生成一个新的映射。这就是为什么 countain?

    (def some-account (assoc some-account :owner :any-owner))
    

    您正在捕获 协会 一些帐户 contain? 操作返回true。

        2
  •  6
  •   missingfaktor Kevin Wright    14 年前

    user=> (def some-account {:number :any­-number :balance :any­-balance :bank :any-bank})
    #'user/some-account
    user=> (contains? some-account :bank)
    true
    user=> (def updated-map (assoc some-account :owner :any-owner))
    #'user/updated-map
    user=> (contains? updated-map :owner)
    true
    user=>
    
        3
  •  3
  •   Arthur Ulfeldt    14 年前

    当update函数生成一个新的映射时, 他们不照搬旧的 他们生产了一个新的,共享的所有部分,没有改变与旧的一个,只取代了部分所需的变化。

    [1]: http://clojure.org/functional_programming#Functional 程序设计不可变数据结构

        4
  •  1
  •   kristofklee    14 年前

    因为assoc和dissoc返回新对象并且不更改某些帐户

        5
  •  1
  •   John Lawrence Aspden    14 年前

    假设您使用的是数字而不是地图:

    user> (def s 3)
    #'user/s
    user> (= s 3)
    true
    user> (+ 1 s)
    4
    user> (= s 4)
    false
    user> (def s (+ 1 s)) ;;don't do this! changing definitions shouldn't be used in a program, only at the REPL for trying things out!
    #'user/s
    user> (= s 4)
    true
    user> (- s 1)
    3
    user> (= s 4)
    

    在Clojure中,大多数值的行为类似于数字。有些东西是可变的,但它们隐藏在神秘的接口后面。很多编程都可以不用它们来完成。

    但是我们怎样才能编程而不改变变量呢?你可能见过阶乘函数

    (defn factorial [n]
            (if (< n 2) 1
                (* n (factorial (dec n)))))
    
    user> (factorial 5)
    120
    

    这里有一个类似的函数,它以相同的方式构建地图

    (defn char-map [n]
            (if (< n 0) {}
                (assoc (char-map (dec n)) n (char n))))
    
    user> (char-map 10)
    {various control characters..}
    

    它们是看待同一事物的两种不同方式。

    通常很容易在它们之间进行翻译,所以如果你能想到一种方法,你就已经想到另一种了。但这确实需要练习,比如学拉丁语。