如何从Clojure中的first获取默认值?
>1 first[]返回NullPointerException 如何使first[]返回默认值,例如0,而不是nil?您可以使用或绕过nil值 因为在Clojure中,nil被视为假值。您可以使用或绕过nil值如何从Clojure中的first获取默认值?,clojure,Clojure,>1 first[]返回NullPointerException 如何使first[]返回默认值,例如0,而不是nil?您可以使用或绕过nil值 因为在Clojure中,nil被视为假值。您可以使用或绕过nil值 因为在Clojure中,nil被视为一个虚假的值。您应该如何在设计中明确定义功能对象 因为您需要一个功能:给定一个集合coll提取第一个元素或默认值为0,那么您应该有一个单独的函数用于此 e、 g 定义第一个或零[coll] if seq coll 第一列0 尽管编写起来有点麻烦,而且
因为在Clojure中,nil被视为一个虚假的值。您应该如何在设计中明确定义功能对象 因为您需要一个功能:给定一个集合coll提取第一个元素或默认值为0,那么您应该有一个单独的函数用于此 e、 g 定义第一个或零[coll] if seq coll 第一列0 尽管编写起来有点麻烦,而且or宏似乎能让您更快地到达目的地,但您错过了FP这一强大的概念 a通过这种方式,您可以对需要执行的操作进行纯粹的功能描述 b你可以通过证明或单元测试来测试它 你可以在任何地方重复使用它,对改变的影响最小 一种更灵活的方法是: 先定义还是默认 [coll]第一个或默认coll 0 [coll-dflt-val] if seq coll 第一coll dflt val
然后只需调用:<1 first或default coll 0imho您应该在设计中明确定义功能对象 因为您需要一个功能:给定一个集合coll提取第一个元素或默认值为0,那么您应该有一个单独的函数用于此 e、 g 定义第一个或零[coll] if seq coll 第一列0 尽管编写起来有点麻烦,而且or宏似乎能让您更快地到达目的地,但您错过了FP这一强大的概念 a通过这种方式,您可以对需要执行的操作进行纯粹的功能描述 b你可以通过证明或单元测试来测试它 你可以在任何地方重复使用它,对改变的影响最小 一种更灵活的方法是: 先定义还是默认 [coll]第一个或默认coll 0 [coll-dflt-val] if seq coll 第一coll dflt val 然后只需调用:<1 first或default coll 0or解决方案适合这种情况。对于不足或不充分的情况,另一个选项是使用带异常默认宏: or解决方案适用于这种情况。对于不足或不充分的情况,另一个选项是使用带异常默认宏: 使用: 用0替换>的零秒参数的函数是
(fnil > nil 0)
所以比如说,
((fnil > nil 0) 1 (first []))
=> true
使用:
用0替换>的零秒参数的函数是
(fnil > nil 0)
所以比如说,
((fnil > nil 0) 1 (first []))
=> true
谢谢你的修改,第一次修改差点让我窒息;谢谢你的修改,第一次修改差点让我窒息;如果第一个只返回nil,它是否应该返回默认值?如果seq的第一个值为false[false]或nil[nil]?@PiotrekBzdyl噢,天哪。。。如果列表为空。如果第一个只返回nil,它是否应该返回默认值?如果seq的第一个值为false[false]或nil[nil]?@PiotrekBzdyl噢,天哪。。。如果列表是空的,我个人不认为使用或宏会使代码功能降低。我个人更喜欢重用或,因为它是clojure的一部分,而不是引入单独的函数。这是最好的解决方案,因为它处理第一个元素为nil的集合,但我不能真的对它投赞成票,因为关于它是否有功能的荒谬的咆哮。我没有说它是否有功能——作为一个宏,它将取代任何有功能的东西。我只是说,对于上述问题,有一种“更”实用的做事方式。我的意图是让Clojure/Lisp上的新手也能深入了解or的逻辑:我个人不认为使用or宏会降低代码的功能。我个人更喜欢重用或,因为它是clojure的一部分,而不是引入单独的函数。这是最好的解决方案,因为它处理第一个元素为nil的集合,但我不能真的对它投赞成票,因为关于它是否有功能的荒谬的咆哮。我没有说它是否有功能——作为一个宏,它将取代任何有功能的东西。我只是说,对于上述问题,有一种“更”实用的做事方式。我的目的是让Clojure/Lisp上的新手也能对or的逻辑提供一些见解: