当我想测试结果是另一个函数的函数时发生。我有这样的事情:
ns flexsearch.core
(defn init [{:keys [tokenizer split indexer filter] :as options}]
(let [encoder (get-encoder (:encoder options))]
(assoc (merge {:ids {} :data {}} options)
:indexer (get-indexer indexer)
:encoder encoder
:tokenizer (if (fn? tokenizer) tokenizer #(string/split % (or split #"\W+")))
:filter (set (mapv encoder filter)))))在测试中:
ns flexsearch.core-test
[flexsearch.core :as f]
(def split #"\W+")
(is (= (f/init {:tokenizer false :split split :indexer :forward :filter #{"and" "or"}})
{:ids {},
:data {},
:tokenizer f/init/fn--14976,
:split #"\W+",
:indexer f/index-forward,
:filter #{"or" "and"},
:encoder f/encoder-icase}))这样做的结果是:
{:ids {},
:data {},
:tokenizer #function[flexsearch.core/init/fn--14976],
:split #"\W+",
:indexer #function[flexsearch.core/index-forward],
:filter #{"or" "and"},
:encoder #function[flexsearch.core/encoder-icase]}我知道我必须将f/index前向,而不是repl弯曲搜索/索引转发的结果,但是它不适用于f/init/fn-14976(没有这样的var: F/init/fn-14976)
我认为这是对瓦尔斯的戏法,但我不知道它到底是如何工作的。任何你能提供的读物我都会感激的
--编辑--f/index-前进和f/编码器-icase标记工作正常。
-编辑2--我已经定义了:
(defn spliter [split] (fn [x] (string/split x (or split #"\W+"))))并将其用于:
(defn init [{:keys [tokenizer split indexer filter] :as options}]
(let [encoder (get-encoder (:encoder options))]
(assoc (merge {:ids {} :data {}} options)
:indexer (get-indexer indexer)
:encoder encoder
:tokenizer (if (fn? tokenizer) tokenizer (spliter split))
:filter (set (mapv encoder filter)))))我得到了一个类似的“:记号器#FunctionFlexsearch.core/spliter/fn-34857”,我在测试中使用了它,它也失败了-
发布于 2020-09-25 02:48:04
我认为是因为令牌程序是一个匿名函数,所以出现了"No这么var“错误。
如果在flexsearch.core中将默认的令牌器定义为非匿名函数,然后在测试中使用该名称,它就会工作。
但是,通常情况下,不能将两个函数进行比较,就像@cfrick所说的那样。当您比较一些值是函数的映射时,您仍然在比较函数。
https://stackoverflow.com/questions/64056434
复制相似问题