代码之家  ›  专栏  ›  技术社区  ›  Rodney Gitzel

与Scala等价的“With”语句?

  •  14
  • Rodney Gitzel  · 技术社区  · 14 年前

    ( n.child.size > 0 ) && ( n.child.filter( ! _.isInstanceOf[Text] ).size == 0 )
    

    ('n'是scala.xml.Node,但这并不重要。也不是特别的逻辑。)

    调用child()两次不太好,所以我准备更改它:

    val list = n.child
    ( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 )
    

    n.child{ list => ( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 ) }
    

    甚至

    n.child.with{ list => ... }
    

    6 回复  |  直到 14 年前
        1
  •  18
  •   Dave Griffith    14 年前

    当然,“with”在Scala中是一个保留字,因此我们称之为“let”,它与Lisp和Haskell中的绑定形式类似。原来“let”只是编写函数应用程序的一种倒退方式。

    def let[A,B](param:A)(body: A=>B):B = body(param)
    
    let(n.child){list=> ...}
    

        2
  •  21
  •   Ken Bloom    14 年前
    {
        import n.child._
        ( size > 0 ) && ( filter( ! _.isInstanceOf[Text] ).size == 0 )
    }
    
        3
  •  8
  •   Ken Bloom    14 年前
    class Tap[A](underlying:A){
       def tap[B](func: A=>B) = func(underlying)
    }
    
    implicit def anyToTap[A](underlying:A)=new Tap(underlying)
    
    n.child.tap{x =>
       ( x.size > 0 ) &&
       ( x.filter( ! _.isInstanceOf[Text] ).size == 0 )
    }
    
        4
  •  4
  •   David Winslow    14 年前

    如果只想限制中间变量的范围,也可以在谓词周围创建一个块:

    val n = getNodeByMagic()
    val passesTest = {
        val child = n.child
        child.length == 0 && !child.filter(_.isInstanceOf[Text]).isEmpty
    }
    // child is not defined outside of the block
    
        5
  •  1
  •   caeus    8 年前

    你可以用 match

    n.child match {
    case list => ( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 )
    }
    
        6
  •  1
  •   Xavier Guihot    6 年前

    启动 Scala 2.13 ,标准库现在提供了一种链接操作方法 pipe 正好符合这一需要:

    import scala.util.chaining._
    
    n.child.pipe(list => list.size > 0 && list.filterNot(_.isInstanceOf[Text]).size == 0)
    

    价值 n.child 是“管道”的功能感兴趣。