Неактивное обдумывание от ученика Scala, возможно, но... в моем лужении я записал следующее:
( n.child.size > 0 ) && ( n.child.filter( ! _.isInstanceOf[Text] ).size == 0 )
('n' scala.xml. Узел, но это не важно. Ни конкретная логика.)
Вызов ребенка () дважды не так хорош, таким образом, я собирался изменить его:
val list = n.child
( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 )
Но данный, сколько я приехал для много понимания способности отфильтровать () и карта () и такой, не будучи должен объявить промежуточные переменные, я сразу нашел это вонючим. Это так... так... так выход Java!:p
Увы, рытье через ТАК и Google и ScalaDocs (особенно Любой и AnyRef) и Книга не подняло ничего соответствующего. Я надеялся, возможно, на что-то как:
n.child{ list => ( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 ) }
или даже
n.child.with{ list => ... }
Что-то вроде этого существует? Или я просто оказываюсь в variable-less-ness пыле?
"with", конечно, зарезервированное слово в Scala, поэтому назовем его "let", от аналогичной формы связывания в Lisp и Haskell. Оказывается, "let" - это просто обратный способ написания применения функций.
def let[A,B](param:A)(body: A=>B):B = body(param)
let(n.child){list=> ...}
Если связанная переменная используется только один раз, можно, конечно, использовать анонимную форму функции, но это противоречит цели.
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 )
}
{
import n.child._
( size > 0 ) && ( filter( ! _.isInstanceOf[Text] ).size == 0 )
}
Если вы просто хотите ограничить область действия вашей промежуточной переменной, вы также можете просто создать блок вокруг предиката:
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