繁体   English   中英

如何在Clojure中将参数传递给静态方法?

[英]How to pass in a parameter to a static method in Clojure?

我有以下方法:

package com.streambright.http.handlers;

import org.rapidoid.http.Req;
import org.rapidoid.u.U;

import java.util.Map;

public class EchoHandler {

    public static Map<String, String> handleEcho(Req req) {
        return U.map(req.headers());
    }
}

当我使用它时,它就很好了:

On.get("/echo").managed(false).json(EchoHandler::handleEcho);

但是,当我尝试在Clojure中执行相同操作时,它将失败,并带有错误数量的参数。

处理器:

(ns s.echo-http-handler
  (:import
    [org.rapidoid.http  Req ]
    [org.rapidoid.u     U   ] )
  (:gen-class
    :methods [^:static [handler [org.rapidoid.http.Req] java.util.Map]]))

(defn -handler
  [Req req]
  (U/map (.headers req)))

当我启动服务器时:

(ns s.http
  (:require
    [s.echo-http-handler  :as echo    ] )
  (:import
    [org.rapidoid.config  Conf  ]
    [org.rapidoid.setup   On    ] ) )

    (defn start
      []
      (set-http-params!)
      (.json (.managed (On/get "/echo") false) echo/-handler))

它启动并引发以下错误:

clojure.lang.ArityException: Wrong number of args (0) passed to: echo-http-handler/-handler

如何将请求传递给Clojure中的函数?

我以前经常玩Rapidoid。 您在这里的错误是,您试图仅传递Clojure函数作为处理程序。 相反,它应该是ReqHandler Java类的实例。 因此,您需要创建一个扩展它的匿名类的实例。

错误:

(defn -handler
  [Req req]
  (U/map (.headers req)))

正确:

(reify ReqHandler
 (execute [this, ^Req req]
   ;; here, access req's fields to write the body or headers
   ))

假设问题出在处理Clojure函数的方式上,则应执行以下操作:

(ns your-namespace
  (:import [org.rapidoid.http Req ReqHandler]))

; Helper to create an object that implements ReqHandler
(defn makeReqHandler [f]
  ; Basically "new ReqHandler {...}"
  (reify ReqHandler
    (execute [this, ^Req req] (f req))

该函数采用Clojure函数,并使用它来创建实现ReqHandler的对象。 我认为这个问题是它是假设(出于某种原因)你想要的0元数过载.json ,当你真正想要的是传递一个参数回调过载。 该助手应该防止这种混乱。

然后用作:

(let [handler (makeReqHandler echo/-handler)]
  (.json (.managed (On/get "/echo") false) handler)))

尽管那也可以写成:

(->  (On/get "/echo")
     (.managed false)
     (.json handler))

甚至内联处理程序以表明仍然可以使用包装函数使用简洁的匿名函数语法:

(->  (On/get "/echo")
     (.managed false)
     (.json (makeReqHandler #(U/map (.headers %)))))

可以说,这更具可读性。 因为this始终是使用Java互操作时的隐式第一个参数, doto->非常适合消除嵌套。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM