【问题标题】:longs functiooon cloj肺功能障碍
【发布时间】:2011-12-04 04:56:41
【问题描述】:

我正在尝试使用longs 函数,但它不起作用:

(println (longs 1 2 3))

有什么例子吗?

网站上的描述不是很好,这就是我遇到问题的原因 http://clojure.org/cheatsheet

谢谢

【问题讨论】:

  • 你期待什么,你得到什么,你为什么不喜欢它?

标签: clojure


【解决方案1】:

你的问题非常不完整,但我还是会尝试一下。

longs 的文档说:

用法:(longs xs)

这意味着,它需要 一个 参数(在此示例中名为 xs)。您正在向它传递三个参数。

longs 的文档继续如下:

投射到long[]

强制转换意味着:它不会改变 xs,它只是检查它是否是一个原始数组 long,然后将这些信息提供给编译器。基本上,将产生 long[] 的表达式包装在 (longs ...) 中是 Clojure 的类型提示,因此它不必在运行时使用反射来解析使用该值作为参数的方法调用:

// Suppose we have a java class
class JavaClass {
    static long[] getSomeLongs() { ... }
    static long sum(long[] numbers) { ... }
    static float sum(float[] numbers) { ... }
}

;; And this Clojure code:

(defn numbers [] (JavaClass/getSomeLongs))
(JavaClass/sum (numbers))

Clojure 是动态类型的,所以当它编译第二行时,它不会知道 (numbers) 返回一个 long 数组。它必须等到运行时,然后使用反射查找正确的 JavaClass/sum 方法。这是昂贵的。

解决方案是向 Clojure 编译器提示 (numbers) 的类型。这样它就可以在编译时选择正确的方法来调用,从而使程序运行得更快:

(JavaClass/sum (longs (numbers)))

但是,从您非常不完整的问题来看,这可能不是您在联系longs 时所期望的。您似乎希望它会根据您提供的参数创建一个 long 数组。如果这就是你想要的,那么就使用这个:

(into-array Long/TYPE [1 2 3])

但是,您可能会对打印结果感到失望:

user=> (println (into-array Long/TYPE [1 2 3]))
#<long[] [J@2321b59a>

当您要求 Java 将数组转换为字符串时,这就是 Java 所返回的,所以这就是 Clojure 打印的内容。如果要查看打印回来的数组内容,需要做一个序列:

user=> (println (seq (into-array Long/TYPE [1 2 3])))
(1 2 3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2018-02-24
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多