我无法在Clojure中创建Java枚举.我想创建一个使用Java接口的Java枚举,然后将其传递给Java方法,所有这些都在Clojure中.我想这样做是为了使用neo4j图形库(我不想使用某人的预建接口,我想编写自己的互操作代码).
我在互联网上搜索,看起来我可以使用代理方法,但我不能为我的生活让它工作.这是我需要在Clojure中编写的等效Java代码:
private static enum RelTypes implements RelationshipType
{
KNOWS
}
Run Code Online (Sandbox Code Playgroud)
这是我对它的刺痛(这不对:():
(proxy [org.neo4j.graphdb.RelationshipType] [] (KNOWS))
Run Code Online (Sandbox Code Playgroud)
我也想知道是否有一个很好的网站可以记录我所缺少的这类内容.我知道关于Clojure网站上的Clojure文档,这非常有用,但是例如使用我无法总是找到我需要的东西.也许我需要一本好的参考书?
当使用现有的java类时,如果我做错了某些事情,我经常会收到反射警告,例如
IllegalArgumentException找不到匹配的字段:获取类java.lang.String clojure.lang.Reflector.getInstanceField(Reflector.java:271)
在每次调用给定方法时,clojure是否在运行时进行反射?或者这是以任何方式缓存的?将任何类型的java-interop移动到相关的java类中是否会有速度优势?
我正在玩Clojure和Java Interop,我想出了以下内容来检查某些实例的方法:
(defn methods-of [instance & [string]]
{:pre [(nil? instance)]}
(filter #(re-find (re-pattern (or string #".*")) %) (map #(.getName %) (-> instance class .getMethods))))
Run Code Online (Sandbox Code Playgroud)
但我想知道,鉴于这是从REPL获取此信息的一种非常实用的方法,如果有一些库可以实现这一目标(以及更多).
为什么这两个表达式都给出相同的结果?
> (macroexpand-all '(->> "string" (.charAt)))
(. "string" charAt)
> (macroexpand-all '(-> "string" (.charAt)))
(. "string" charAt)
难道不应该将“->>”宏插入“ string”作为列表中的最后一个元素吗?
我正在使用一个 java 库并想调用一个导出数据的方法。
此方法有两种变体:一种具有用作目标文件名的 String 参数,另一种接受 OutputStream 对象并使用 OutputStreamWriter 写入该对象。
我想使用第二种方法并且能够将 OutputStream 返回到一个字符串中,这样我就可以用它做任何我想做的事情。
我不确定它实际上是否可行,但是当我发现 clojure.core/with-out-str 我有一些希望它是可能的,但是我不确定如何使用它。
是否可以将 OutputStream 参数从 Clojure 传递给 Java 方法并将写入的数据作为字符串取回?
谢谢。
编辑:
实际上,类构造函数接受一个 OutputStream 参数,一个方法通过它写入并关闭它。希望这可以帮助。
有没有办法将字段访问器转换为函数?当我试图这样做时,我真的很惊讶
(map .x [o1 o2])
Run Code Online (Sandbox Code Playgroud)
但反而必须这样做
(defn x [o] (.x o))
(map x [o1 o2])
Run Code Online (Sandbox Code Playgroud)
这似乎是不必要的.有没有办法为你创建这个功能?
我现在正在用 Clojure 创建一个类对象,它有一个返回对象本身的方法。
用 Java 编写,我想制作的对象是,
class Point {
public double x;
public double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public Point copy() {
return new Point(this.x, this.y);
}
}
Run Code Online (Sandbox Code Playgroud)
我写的当前 clojure 代码就像,
(ns myclass.Point
:gen-class
:prefix "point-"
:init init
:state state
:constructors {[double double] []}
:methods [[copy [] myclass.Point]]))
(defn point-init [x y]
[[] {:x x :y y}])
(defn point-copy [this]
this)
Run Code Online (Sandbox Code Playgroud)
但是,我收到如下错误。
java.lang.ClassNotFoundException: myclass.Point
Run Code Online (Sandbox Code Playgroud)
虽然我用谷歌搜索过这个问题,但我找不到任何答案。有谁知道这个问题的解决方案?
预先感谢您的帮助。
假设files是 Clojure 中的 Java 列表File,我想获取文件名列表。在 Leiningen REPL 中我可以使用,比如说,
(.getName (nth files 4))
=> "image.jpg"
Run Code Online (Sandbox Code Playgroud)
但如果我用
(map .getName files)
Run Code Online (Sandbox Code Playgroud)
REPL 抛出一个CompilerException java.lang.RuntimeException: Unable to resolve symbol: .getName in this context. 这是为什么?
我可以解决这个问题
(defn gn [file] (.getName file))
(map gn files)
Run Code Online (Sandbox Code Playgroud)
但我现在想知道是否有一种更优雅的方法将 Java 方法映射到 Clojure 中的列表。
是否可以在 kotlin 中运行 clojure?春季更具体?
我在 clojure 中制作了刮刀,我想在用 kotlin 编写的 Web 应用程序中使用它们。这在 kotlin 中看起来如何?编码..
我在某处看到过这个文档,但我不记得函数的名称和名称:我正在搜索的是一个函数/宏,它以(Java)对象作为参数,在该对象上执行一系列方法,然后返回它。类似的东西:
(<the function> obj
(.setName obj "the name")
(.setAmount obj42.0)
; ...
(.setDescription obj "the description")) ; returns the updated obj
Run Code Online (Sandbox Code Playgroud)