我有一个问题,关于什么是Datomic的更惯用的架构.
假设我们有实体User,Post并且Topic.
Post可以属于Topic,User和其他Post(回复).现在,我应该
a)创建一个:posts属性,它只是一个Posts 列表,并将其注入需要引用多个Posts的每个实体中?
要么
b)建立更明确的关系,例如a Post有一个:post/author属性是对用户的引用,也许是一个:post/belongs-to可以引用一个Topic或另一个的属性Post?
观察:如果我做b,我似乎得到更多的语义关系.我可以举例来说(:post/_author user-entity),它更能描述他们关系网的性质而不是(:posts user-entity)(因为,它User具有:posts什么意义?是那些被User收藏Post的,是作者Post的,还是什么?)
b的另一个副作用是我可以创建一个新的Post而不会改变任何其他实体.如果我做一个,我需要创建Post并把它插入到:posts的属性User,需要两个操作,而不是一个.
不过,我有一个感觉,一个可能是做的更地道的方式.例如,似乎更容易看到属性列表如何:posts随着时间的推移而发生变化,我是否应该这样做,如果User引用:posts而不是通过属性Post引用.User:post/author …
在Clojure中,我可以使用类似这样的解决方案:用于正则表达式匹配的紧凑Clojure代码及其在字符串中的位置,即re-matcher从中创建和提取信息,但重新匹配器似乎不在ClojureScript中实现.在ClojureScript中完成同样的事情有什么好方法?
编辑:
我最后编写了一个补充函数,以便保留正则表达式的修饰符,因为它被吸收到re-pos:
(defn regex-modifiers
"Returns the modifiers of a regex, concatenated as a string."
[re]
(str (if (.-multiline re) "m")
(if (.-ignoreCase re) "i")))
(defn re-pos
"Returns a vector of vectors, each subvector containing in order:
the position of the match, the matched string, and any groups
extracted from the match."
[re s]
(let [re (js/RegExp. (.-source re) (str "g" (regex-modifiers re)))]
(loop [res []]
(if-let [m (.exec re s)]
(recur (conj res …Run Code Online (Sandbox Code Playgroud) 我从这里知道官方的立场是在操作文件之前不检查是否存在:Node.js 检查存在文件相反,应该简单地尝试写入并处理可能抛出的任何异常。
但是,我的情况是我只想将某个文件写入文件夹,因为该文件不存在。如果文件存在,我什么都不想做。
实现这一目标的惯用方法是什么?