考虑以下函数调用:(into [] (some_expression))
让我们说(some_expression)
可能会产生nil
,或者某个有效的向量(例如[1 2 3]
)。我想要实现的是,如果(some_expression)
的结果是nil
,那么我最终会使用[nil]
,而不是[]
(执行{{1}后) })。 (当然,如果它是一些有效的向量,如into
,那么我希望[1 2 3]
。)
到目前为止我考虑过的可能性:
vec
:错误,因为[1 2 3]
,因此最终结果仍为(vec nil) = []
vector
:错误,因为[]
,因此,最终结果将为(vector [1 2 3]) = [[1 2 3]]
。 (但它适用于[[1 2 3]]
。)nil
或ensure-vector
:这可以解决问题,但我会问是否有更短的内容(可能内置于Clojure中)实现相同的as-vector
我担心没有简短的解决方案,因为否则会在这个问题中提及;还是那个人已经很老了,所以我希望他们从那时起就可以将这个功能添加到Clojure中。
此外,该问题存在一些重要差异:
(into [] (let [result (some_expression)] (if (nil? result) [nil] result)))
"我正在寻找的只能为ensure-vector
工作。 (即,如果nil
返回(ensure-vector 2)
而不是2
,那就没问题了。)我想这不算数,但是谁知道。[2]
"完全不同的方法。也没关系。例如,如果ensure-vector
有一些特殊参数导致它将into
参数解释为要插入的值而不是源集合,那么这也将解决我的问题。 (这更多是为了举个例子:据我所知documentation of into,它没有这样的形式。虽然,坦率地说,我不太确定from
是什么意思在xform
。但我想这是别的......)答案 0 :(得分:4)