代码之家  ›  专栏  ›  技术社区  ›  trzczy

java.lang.illegalargumentException错误,具体取决于使用的符号名-clojure

  •  0
  • trzczy  · 技术社区  · 7 年前

    我是Clojure的初学者。我正在执行一个操作两次,但符号已更改 lang 反对 language

    一种情况很好,另一种情况是抛出错误: java.lang.IllegalArgumentException: No method in multimethod 'my-method' for dispatch value: null

    我不确定这是由Clojure语法引起的,还是我的Linux配置有问题。我有Debian Stretch和Boot.clj。

    错误发生在终端上。以下是代码和错误的两个和平:

    s@lokal:~$ boot repl
    nREPL server started on port 36091 on host 127.0.0.1 - nrepl://127.0.0.1:36091
    java.lang.Exception: No namespace: reply.eval-modes.nrepl found
    REPL-y 0.4.1, nREPL 0.4.4
    Clojure 1.8.0
    OpenJDK 64-Bit Server VM 1.8.0_181-8u181-b13-2~deb9u1-b13
            Exit: Control+D or (exit) or (quit)
        Commands: (user/help)
            Docs: (doc function-name-here)
                  (find-doc "part-of-name-here")
    Find by Name: (find-name "part-of-name-here")
          Source: (source function-name-here)
         Javadoc: (javadoc java-object-or-class-here)
        Examples from clojuredocs.org: [clojuredocs or cdoc]
                  (user/clojuredocs name-here)
                  (user/clojuredocs "ns-here" "name-here")
    boot.user=> (do
           #_=> (defmulti my-method (fn[x] (x "lang")))
           #_=> (defmethod my-method "English" [params] "Hello!")
           #_=> (def english-map {"id" "1", "lang" "English"})
           #_=>     (my-method english-map)
           #_=> )
    "Hello!"
    boot.user=> 
    
    boot.user=> (do
           #_=> (defmulti my-method (fn[x] (x "language")))
           #_=> (defmethod my-method "English" [params] "Hello!")
           #_=> (def english-map {"id" "1", "language" "English"})
           #_=>     (my-method english-map)
           #_=> )
    
    java.lang.IllegalArgumentException: No method in multimethod 'my-method' for dispatch value: null
    boot.user=>
    

    我必须先补充一下 语言 但不能 . 当我换了一个 my-method 符号名称 mymetho-d greeting .

    1 回复  |  直到 7 年前
        1
  •  2
  •   Taylor Wood    7 年前

    defmulti 定义var,并随后调用 解复用 用同样的名字什么也不做,所以你的第二个 解复用 调用无效,原始调度功能保持不变。有 remove-method remove-all-methods 去除 defmethod 定义,但要删除 解复用 定义(不重新启动repl)您可以使用 alter-var-root 要将var设置为nil:

    (defmulti my-method (fn [x] (x "lang")))
    (defmethod my-method "English" [params] "Hello!")
    (def english-map {"id" "1", "lang" "English"})
    (my-method english-map)
    => "Hello!"
    
    (alter-var-root #'my-method (constantly nil)) ;; set my-method var to nil
    
    (def english-map {"id" "1", "language" "English"})
    (defmulti my-method (fn [x] (x "language")))
    (defmethod my-method "English" [params] "Hello!")
    (my-method english-map)
    => "Hello!"
    

    你可以使用 ns-unmap 类似效果:

    (ns-unmap *ns* 'my-method)
    
    推荐文章