小编new*_*Dev的帖子

Clojure - 在地图上使用记录有什么好处

我很难决定何时使用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 的感觉,似乎我反对更实用的风格。所以,我的问题分为两个: …

functional-programming clojure diamond-problem

6
推荐指数
1
解决办法
697
查看次数

Clojure/Clojurescript:解析的参数必须是带引号的符号

我正在尝试使用保存在变量中的字符串来调用如下函数:

(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 被本地隐藏。我不想覆盖函数只是调用它。不知道我哪里出错了。我看过几个例子,但无法确定。

clojurescript

4
推荐指数
1
解决办法
584
查看次数

Clojure - 如何在单元测试中正确挂载状态

我正在尝试使用 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)

据我所知,这没有正确安装数据库,因此它无法调用数据库操作。我尝试将此安装代码移至测试中,但仍然收到相同的错误。

我确实让它发挥作用: …

testing clojure mongodb monger luminus

3
推荐指数
1
解决办法
1411
查看次数

从 React 组件库多次导出

我正在尝试创建一个具有多个独立组件的组件库。最终目标是允许用户做类似的事情

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 方项目中单独导入?

javascript typescript reactjs webpack

3
推荐指数
1
解决办法
3443
查看次数