Оператор “With”, эквивалентный для Scala?

Неактивное обдумывание от ученика 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 пыле?

14
задан Rodney Gitzel 13 July 2010 в 20:14
поделиться

4 ответа

"with", конечно, зарезервированное слово в Scala, поэтому назовем его "let", от аналогичной формы связывания в Lisp и Haskell. Оказывается, "let" - это просто обратный способ написания применения функций.

def let[A,B](param:A)(body: A=>B):B = body(param)

let(n.child){list=> ...}

Если связанная переменная используется только один раз, можно, конечно, использовать анонимную форму функции, но это противоречит цели.

18
ответ дан 1 December 2019 в 06:10
поделиться
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 )
}
8
ответ дан 1 December 2019 в 06:10
поделиться
{
    import n.child._
    ( size > 0 ) && ( filter( ! _.isInstanceOf[Text] ).size == 0 )
}
21
ответ дан 1 December 2019 в 06:10
поделиться

Если вы просто хотите ограничить область действия вашей промежуточной переменной, вы также можете просто создать блок вокруг предиката:

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
4
ответ дан 1 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: