Clojure序列的长度

wro*_*ame 31 functional-programming clojure

我本来可以发誓我曾经alength工作过,但我现在还不太清楚我做错了什么:

user=> (alength '(1 2 3))
IllegalArgumentException No matching method found: alength  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
user=> (alength [1 2 3])
IllegalArgumentException No matching method found: alength  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
user=> (doc alength)
-------------------------
clojure.core/alength
([array])
  Returns the length of the Java array. Works on arrays of all
  types.
nil
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能在Clojure中获取列表/数组的长度?

Ósc*_*pez 49

尝试使用count:

(count '(1 2 3))
=> 3
(count [1 2 3])
=> 3
Run Code Online (Sandbox Code Playgroud)


sku*_*uro 36

正如文档字符串所说,alength适用于Java™数组,例如a String[]Integer[],它绝对是您想要使用的Clojure列表或向量的不兼容类型count:

user=> (def x '(1 2 3))
#'user/x
user=> (def xa (to-array x))
#'user/xa
user=> (class x)
clojure.lang.PersistentList
user=> (class xa)
[Ljava.lang.Object;
user=> (alength xa)
3
user=> (alength x) 
java.lang.IllegalArgumentException: No matching method found: alength (NO_SOURCE_FILE:0)
user=> (count x)
3
Run Code Online (Sandbox Code Playgroud)

[Ljava.lang.Object;是不可思议的方式toString定义为输出原生Object阵列.

  • 注意,`count`也适用于数组.只有速度关键代码才需要`alength`,你已经知道你有一个数组并且需要直接访问.`count`在这里会慢一些,因为它更通用. (5认同)

kat*_*ugh 14

它应该是count.

user=> (count '(1 2 3))
3
Run Code Online (Sandbox Code Playgroud)