我正在使用 Scala 2.9.2,并想根据某些条件构建一个列表。
考虑以下情况,其中 cond 是某个函数,采用谓词 p 和类型 T 的值(在本例中为 t3):
t1 :: t2 :: cond( p, t3 ) :: t4
我想要的行为如下。如果 p 为真,这应该给出:
List[T]( t1, t2, t3, t4 )
如果 p 评估为假,这应该给出:
List[T]( t1, t2, t4 )
我可能正在以完全错误的方式思考这个问题,但我正在努力想出一个优雅的解决方案。我可以在任何地方都涉及选项,然后进行过滤,但这会使代码更难阅读:
def cond[T]( p : => Boolean, v : T ) : Option[T] =
{
p match
{
case true => Some( v )
case false => None
}
}
这允许以下操作:
scala> ( Some( 1 ) :: Some( 2 ) :: cond( true, 3 ) :: Some( 4 ) :: Nil ).flatten
res4: List[Int] = List(1, 2, 3, 4)
scala> ( Some( 1 ) :: Some( 2 ) :: cond( false, 3 ) :: Some( 4 ) :: Nil ).flatten
res5: List[Int] = List(1, 2, 4)
然而,这不是最优雅的解决方案,因为它要求用户将所有非条件元素包装在 Some() 中,并记住在最后进行展平。谁能想到一个更优雅的解决方案?