问题描述
在Clojure /脚本中,contains?
函数可用于检查后续的get
是否成功。我相信Clojure版本可以进行测试,而无需获取其价值。 ClojureScript版本使用get
,并且确实检索值。
是否存在等效的函数来测试get-in
使用的通过地图的路径是否成功?那是在不获取值的情况下进行测试吗?
例如,这是contains-in?
的天真的实现,类似于contains?
的ClojureScript版本,它在执行测试时会检索值。
(def attrs {:attrs {:volume {:default "loud"}
:bass nil
:treble {:default nil}}})
(defn contains-in? [m ks]
(let [sentinel (js-obj)]
(if (identical? (get-in m ks sentinel) sentinel)
false
true)))
(defn needs-input? [attr-key]
(not (contains-in? attrs [:attrs attr-key :default])))
(println "volume: needs-input?: " (needs-input? :volume))
(println " bass: needs-input?: " (needs-input? :bass))
(println "treble: needs-input?: " (needs-input? :treble))
;=>volume: needs-input?: false
;=> bass: needs-input?: true
;=>treble: needs-input?: false
“属性”映射中不包含默认值的所有内容都需要用户输入。 (nil
是可接受的默认值,但缺失值不是。)
解决方法
function register(user) {
return dispatch => {
axios.post(`${BASE_URL}/users`,user).then((response) => {
console.log(response);
dispatch(resetError());
dispatch(success(user));
}).catch((e) => {
console.log('e',e);
dispatch(error(e.status));
})
};
function success(user) { return { type: userConstants.REGISTER,payload: user } };
};
顺便说一句,在查看the source of clojure.lang.RT
中的相关功能时,我注意到(defn contains-in? [m ks]
(let [ks (seq ks)]
(or (nil? ks)
(loop [m m,[k & ks] ks]
(and (try
(contains? m k)
(catch IllegalArgumentException _ false))
(or (nil? ks)
(recur (get m k) ks)))))))
和contains?
的行为在它们的第一个参数是字符串或Java数组时可能有点麻烦,如下图所示:
get