我在解决如何使用“let”形式方面遇到了一些麻烦。在下面的示例中,我想在本地绑定值“cols”,以便稍后在函数中处理它。然而,我注意到,如果我使用“let”函数,则sel-opt-tmp函数将返回一个nil值而不是列表。
(defn sel-opt-tmp []
(let [cols "test"]))
(prn (sel-opt-tmp))
*上面的代码返回一个nil值。
我理解“let”只绑定函数范围内的值,我不知道是否有办法将值传递给let范围。也许有一些我不知道的“回归”?或者这只是糟糕的设计,在这种情况下我根本不应该使用绑定(这往往会创建很难读取的长链函数)?
答案 0 :(得分:21)
它返回nil,因为let语句的内容为空(或nil)。尝试:
(let [cols "test"] cols)
将返回cols
的值。正如seh所说,let语句将计算其最后一个子表达式的值。
答案 1 :(得分:3)
如您所述,将值传递到范围之外没有这样的问题。 绑定 cols
仅在范围内有效,但(:ks cols)
的值的生命周期不受类似限制。 (这就是为什么你有垃圾收集:你可以返回指向数据的值,只要有引用数据,数据就会保持实时。)
如果你从函数中得到nil,那可能意味着cols
没有:ks
键......或者实际上可能不是地图。由于cols
是filter
的结果,因此它是一个序列,当:ks
关键字用作函数时,它会为非集合返回nil。为了防止这种错误,总是写(cols :ks)
而不是(:ks cols)
可能是一个有用的约定,这样当你认为地图是别的时候就会出错。