我很难决定何时使用defrecord是正确的选择,更广泛地说,我在我的记录中使用的协议是否符合语义 clojure 和功能性。
在我当前的项目中,我正在构建一个游戏,该游戏具有不同类型的敌人,它们都具有相同的一组动作,这些动作可能以不同的方式实现。
来自 OOP 背景,我很想做这样的事情:
(defprotocol Enemy
"Defines base function of an Enemy"
(attack [this] "attack function"))
(extend-protocol Enemy
Orc
(attack [_] "Handles an orc attack")
Troll
(attack [_] "Handles a Troll attack"))
(defrecord Orc [health attackPower defense])
(defrecord Troll [health attackPower defense])
(def enemy (Orc. 1 20 3))
(def enemy2 (Troll. 1 20 3))
(println (attack enemy))
; handles an orc attack
(println (attack enemy2))
;handles a troll attack
Run Code Online (Sandbox Code Playgroud)
这从表面上看似乎是有道理的。我希望每个敌人总是有一种攻击方法,但实际实施应该能够因特定的敌人而异。使用extend-protocol我能够创建有效的调度方法,根据我的敌人而变化,我可以轻松添加新的敌人类型以及更改这些类型的功能。
我遇到的问题是为什么我应该在通用地图上使用记录?以上对我来说有点 OOP 的感觉,似乎我反对更实用的风格。所以,我的问题分为两个: …
我正在尝试使用保存在变量中的字符串来调用如下函数:
(defn update-product-list [] "Test")
(defn handle-state-change [action]
((resolve (symbol action))))
(handle-state-change "update-product-list")
Run Code Online (Sandbox Code Playgroud)
但是,这给了我以下错误:断言失败:解决的参数必须是带引号的符号
我也尝试将上面的行更改为:
((resolve (quote (symbol action))))
Run Code Online (Sandbox Code Playgroud)
但这仍然会出错。我也尝试将其更改为:
((resolve 'action))
Run Code Online (Sandbox Code Playgroud)
但这给出了一个我不太明白的不同错误:js/action 被本地隐藏。我不想覆盖函数只是调用它。不知道我哪里出错了。我看过几个例子,但无法确定。
我正在尝试使用 Monger 数据库库在 luminus 应用程序中测试一些数据库操作。
理想情况下,我希望以下内容能够发挥作用。我已经删除了一些不相关的代码。
测试文件:
(ns app.test.handler
(:require [clojure.test :refer :all]
[app.db.core :as db]))
(testing "create user"
(db/create-user "test" "test" "test")
(is (true? true))))
Run Code Online (Sandbox Code Playgroud)
数据库文件
(defstate db*
:start (-> env :database-url mg/connect-via-uri)
:stop (-> db* :conn mg/disconnect))
(defstate db
:start (:db db*))
(defn create-user
"Creates a new user with a token"
[username email password]
(let [user {:username username
:email email
:password (hashers/derive password)
}]
(mc/insert db "user" user)))
Run Code Online (Sandbox Code Playgroud)
这不起作用,并给我以下错误:
java.lang.ClassCastException: mount.core.DerefableState cannot be cast to com.mongodb.DB
Run Code Online (Sandbox Code Playgroud)
据我所知,这没有正确安装数据库,因此它无法调用数据库操作。我尝试将此安装代码移至测试中,但仍然收到相同的错误。
我确实让它发挥作用: …
我正在尝试创建一个具有多个独立组件的组件库。最终目标是允许用户做类似的事情
import One from 'component-library'
import Two from 'component-library'
<One/>
<Two/>
Run Code Online (Sandbox Code Playgroud)
但我一直无法得到任何工作。
我目前的布局是
src
-index.tsx
-components
-one
-two
Run Code Online (Sandbox Code Playgroud)
我的代码示例如下:
一.tsx
export default class One {
...
}
Run Code Online (Sandbox Code Playgroud)
然后在我的根 index.tsx
import {default as One} from './components/one/One.tsx'
import {default as Two} from './components/two/Two.tsx'
export {
one,
two
}
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用并在尝试导入时返回 undefined ,如上所示。然而,我只使用一个组件export {default} from './components/one/One.tsx'就可以让它工作,或者只是这样做import One from '.components/one/One.Tsx',我认为我的构建过程应该没问题。在这种情况下,组件在我的其他项目中正确显示。
我还尝试修改我的结构以及我的导入方式,例如在每个组件中使用 index.tsx 文件并从那里导出/导入。所有这些都得到了相同的结果,返回未定义。
如何正确导出这些文件,以便每个文件都可以在 3rd 方项目中单独导入?
clojure ×2
javascript ×1
luminus ×1
monger ×1
mongodb ×1
reactjs ×1
testing ×1
typescript ×1
webpack ×1