为什么两套不相等?

时间:2011-09-06 05:09:36

标签: clojure

问题是关于not=

Clojure> (doc not=)
---------------------
Cloure.core/not=
    ([x] [x y] [x y & more])
    Same as (not (= obj1 obj2))

Clojure> (not= [1 2 3] [1 2 3])
false
Clojure> (not= '(1 2 3) '(1 2 3))
false
Clojure> (not= #(1 2 3) #(1 2 3))
true

任何建议都表示赞赏!

3 个答案:

答案 0 :(得分:14)

设置使用大括号

user=> (not= #(1 2 3) #(1 2 3))
true
user=> (not= #{1 2 3} #{1 2 3})    
false

答案 1 :(得分:4)

仅供参考,#character是clojure reader中的"dispatch macro"。 它告诉读者特别对待它的表达。据我所知,它是 在clojure中定义的唯一读者宏。

  • #( )定义一个函数。 (fn [< optional-args >] ...)
  • 的缩写
  • #" "定义正则表达式
  • #' 引用var it's self而不是var。
  • 中的值
  • #{ }定义一个集合。
  • #_不读下一个声明。这就像一个超级评论,它更多的是通过评论,但区别并不常用。

答案 2 :(得分:1)

其他人评论说#(1 2 3)不是一个集合,而是一个函数(在调用时会引发错误)。 #(1 2 3)不等于#(1 2 3)的原因是#(...)的每次调用都会创建一个新的匿名函数,并且每个新函数都属于一个新的Java类:

user=> (class #(1 2 3))
user$eval60$fn__61
user=> (class #(1 2 3))
user$eval64$fn__65

这些类有一个equals方法,它不会将其他类的对象视为相等,即使它们恰好以相同的方式定义。该方法实际上是继承自java.lang.Object

user=> (for [m (.getMethods (class #(1 2 3)))
             :when (= (.getName m) "equals")]
         (.getDeclaringClass m))
(java.lang.Object)
相关问题