测试“获取”是否成功的功能

问题描述

在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