- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我错过了关于 defmulti 和 defmethod 的重要一点。我已经阅读了几本书对 defmulti 的解释,但我仍然感到困惑。
我想获得一个随机值,具体取决于它是交易还是像 100.00 这样的金额
我想调用 (random-val) 并取回一个avail-trans值或随机小数。我已经尝试将这些函数放在 map 中,但我得到了相同的值,即avail-trans,a\B。
(def^:dynamic map-val {:trans (random-trans) :amt (random-amount)})
(def^:dynamic avail-trans [\B \W \D \A])
(defn random-trans
[]
(nth avail-trans (.nextInt random (count avail-trans))))
(defn random-amount
[]
(float (/ (.nextInt random (count (range 1 10000))) 25 )))
(defmulti random-val :val-type)
(defmethod random-val :trans []
(random-trans))
(defmethod random-val :amt []
(random-amount))
(random-val :trans)
导致此错误:
最佳答案
使用 defmulti
创建多方法;你做对了。 defmulti
需要一个名称和一个调度函数(和一个文档字符串,加上一些选项,如果你愿意的话,但忘了那些)。
(defmulti random-val identity)
defmethod
实现多方法时,你需要指定你正在实现的多方法的名称,它应该匹配的调度值,然后是函数尾部(arglist 加上你想要它做的任何事情)。
(defmethod random-val :trans [t] (random-trans))
(defmethod random-val :amt [t] (random-amt))
java.lang.IllegalArgumentException: No method in multimethod 'random-val' for dispatch value: null (NO_SOURCE_FILE:0)
因为当你分配的调度函数
random-val
,
:val-type
应用于任何其他关键字,它会为您提供
null
.当 Clojure 尝试查找与该调度值匹配的方法时,它会失败。
random-amount
和
random-trans
.
关于clojure - 构造 Clojure defmulti/defmethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8545920/
我有一个专门处理两个参数的多方法: (defmulti get-tag-type (fn [type tag] [type tag])) 拥有类型允许我将不同的 defmethod 调用分组为集合:
我想做的是: (defgeneric fn (x)) (defmethod fn ((x (integer 1 *))) "Positive integer") (defmethod fn (
我有 2 个破坏:monster & orc . orc包括 monster .通用怪物上有通用定义方法,名为 monster-show & monster-hit . orc有专门的monster-
我错过了关于 defmulti 和 defmethod 的重要一点。我已经阅读了几本书对 defmulti 的解释,但我仍然感到困惑。 我想获得一个随机值,具体取决于它是交易还是像 100.00 这样
我有一个 defmulti/defmethod 组,它采用像这样的成对参数...... (defmulti foo "some explanation" (fn [arg1 arg2] (mapv c
我希望创建一个多重方法,如下所示: (defmethod some-method "some value" [ a b ] b) :但仅根据第一个参数“a”选择函数。我该怎么做: (defmu
我想知道为什么使用defmulti和defmethod?有什么优点?你如何使用它?请解释一下代码中发生了什么。 最佳答案 在“一般术语”中,您可以将其称为类固醇的 if/else,而在“给我留下深刻印
前几天了解了defmethod的eql子句参数规范语法。 The defmethod hyperspec清楚地表明 eql 的存在token 是语法的基本部分。例如,当我在 CLISP 中尝试以下操作
在 CLOS 的包 A 中定义泛型并在包 B 中为该泛型提供方法的正确方法是什么? 提前致谢! 例子: (defpackage :common (:use :cl)) (in-package :co
我希望能够使用定义的类型作为 defmethod 的参数专门化器。动机是可读性和后期更改的灵 active 。像这样的事情: (deftype foo () 'fixnum) (defmethod b
我想创建相当于 Haskell 中的“嵌套 LET”,我可以在其中引用一些绑定(bind)在外部 LET 中的值。需要注意的是,在内部作用域中定义的函数需要根据其参数的类型进行分派(dispatch)
考虑这个例子: There is a class named 'first', which is defined in package 'a'. There is also a package 'b'
defmethod 和 defmulti 有什么区别?? 引用了这些链接。但是还是不清楚.. https://clojuredocs.org/clojure.core/defmulti https:/
要么是我遗漏了一些非常愚蠢的东西,要么是 defmethod 和 defun 的特殊变量范围出乎意料地不同(使用 SBCL 1.1.14 测试): 如预期的那样: (defun ttprint-obj
好的,我尝试了这种从外国翻译过来的方法,它确实有效我在我的库中的 structs.lisp 文件中定义了这些,它在我所有其他依赖项之前首先加载 (cffi:defcstruct (cv-size :c
我是一名优秀的程序员,十分优秀!