给定这样的功能
(define (foo) (values 1 2 3))
我可以以某种方式调用(foo)
并仅获取其中一个值,例如(first (foo))
吗?我曾考虑为此定义一个辅助函数,但它必须与被调用函数的匹配性相匹配,这感觉不对。
(define (first x y z) x)
(first (foo))
好吧,简单的方法是只使用define-values
绑定所有三个值,然后忽略后两个。但是,这有点令人不满意。更好的解决方案是使用match-define-values
,它将允许您显式忽略其他两个。
(match-define-values (a _ _) (values 1 2 3))
尽管如此,这实际上并不仅仅是让您包装一个在另一个函数中返回多个值的函数,只是为了获得第一个值。
Racket并没有真正提供用于处理多个值的很多内置功能,而这实际上是设计使然。其他软件包可能包含您想要的功能-例如,该sugar
软件包提供values->list
。
(first (values->list (values 1 2 3)))
出于某种原因,这不在核心库中:这是一种反模式。从函数返回多个值是您应该谨慎执行的事情。在Racket中,没有多少函数会返回多个值,因为它们使程序难以推理。它们的组合不好,而且很少是解决问题的最佳方法。
在某些情况下,多个返回值很有用,通常是在编写出于性能原因一次执行两项操作的函数时。例如,quotient/remainder
刚刚返回的值quotient
和remainder
,但因为它是在一个函数中完成,它可以更有效地实现。同样,split-at
和都调用take
和相同drop
,但效率更高。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句