gpt4 book ai didi

scala - 有条件地调用没有临时变量的成员函数

转载 作者:行者123 更新时间:2023-12-04 22:13:58 25 4
gpt4 key购买 nike

我有一个返回对象的表达式,并且我想仅当某个 bool 条件为真时才对结果对象调用一个方法。我想在 val 中获取结果(无论是对象,还是在对象上调用方法的结果)。

一种方法是使用临时变量,例如在以下示例中,其中 List(3, 1, 2)是返回对象的(可能很复杂)表达式,list是临时变量,而 .sorted是我想有条件地调用的方法:

import scala.util.Random

val condition = Random.nextBoolean
val result = {
var list = List(3, 1, 2);
if (condition) list = list.sorted
list
}

这样做的规范方法是什么,也许不使用临时变量?

注意
if (condition) List(3, 1, 2).sorted else List(3, 1, 2)

不太满意,因为 List(3, 1, 2)通常可能是一个复杂的表达,我不想重复。

这是我发现的一种方法,不幸的是它涉及提供显式类型(并且比上面引入的临时变量更长更复杂):
val condition = Random.nextBoolean
val result =
(
if (condition)
{l: List[Int] => l.sorted}
else
identity(_: List[Int])
).apply(List(3, 1, 2))

我怀疑一定有一种我未能识别的更整洁的方式。

更新:一个稍微不那么丑陋的方法,不幸的是仍然需要明确的类型信息:
val condition = Random.nextBoolean    
val result = {
l: List[Int] => if (condition) l.sorted else l
}.apply(List(3, 1, 2))

最佳答案

您可以使用正向管道运算符:

implicit class PipedObject[A](value: A) {
def |>[B](f: A => B): B = f(value)
}

scala> List(3, 1, 2) |> (xs => if (true) xs.sorted else xs)
res1: List[Int] = List(1, 2, 3)

关于scala - 有条件地调用没有临时变量的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15822527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com