【发布时间】:2010-07-13 20:14:09
【问题描述】:
也许是 Scala 学习者的闲散思考,但是……在我的修补中,我写了以下内容:
( 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 )
但是考虑到我非常感谢能够在不需要声明中间变量的情况下进行 filter() 和 map() 等操作,我立即发现这很糟糕。它是如此...如此...如此Java-ish! :p
唉,翻遍了 SO 和 Google 以及 ScalaDocs(尤其是 Any 和 AnyRef),而 The Book 没有找到任何合适的东西。我希望可能是这样的:
n.child{ list => ( list.size > 0 ) && ( list.filter( ! _.isInstanceOf[Text] ).size == 0 ) }
甚至
n.child.with{ list => ... }
这样的东西存在吗?还是我只是陷入了一种不可变的热情?
【问题讨论】:
-
另外,过滤器/大小的东西效率低下。将其替换为 list.forall(_.isInstanceOf[Text])
-
这就是我最初的想法,但它并不完全相同:我需要知道该列表仅包含 Text 元素并且是非空的。我刚刚发现 Iterable 的“计数”可以缩短一点:( n.child.size > 0 ) && ( n.child.count( ! _.isInstanceOf[Text] ) == 0 )
-
更好:! (n.child.isEmpty || n.child.exists(!_.isInstanceOf[Text]))
-
抱歉,不清楚。我的意思是 !n.child.isEmpty && n.child.forall(_.isInstanceof[Text]) 这与你通过德摩根定律的最后一个相同,而且 !x.exists(!y) 与 x 相同.forall(y)
-
我遇到了同样的问题,但后来我了解到这种 val 的使用非常有益,并且无法与 java 的 mutable vars 相比。特别是如果您使用更好的名称,在本例中为“val child = n.child”,这会使代码更加明显。
标签: scala