重写Scala &&和

Fra*_*ank 0 scala

我想Scala的改写&&,以and下面的方式(我喜欢蟒蛇,这就是为什么我试图做到这一点):

def and(p1: () => Boolean, p2: () => Boolean): Boolean = p1() && p2()
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用它时,例如:

def and(p1: () => Boolean, p2: () => Boolean): Boolean = p1() && p2()
if ((l < h.length) and (h(l) > h(i)))
Run Code Online (Sandbox Code Playgroud)

(我def之前只是为了调试而把它放在线上,以确保它不是可见性问题),我得到:

Error:(40, 26) value and is not a member of Boolean
  if ((l < h.length) and (h(l) > h(i)))
Run Code Online (Sandbox Code Playgroud)

这里发生了什么???

Dim*_*ima 5

做你想做的事的方式是这样的:

  object Pythonians {
    implicit class Bool(val b: Boolean) extends AnyVal { 
      def and(p: => Boolean) = b && p
    }
  }
Run Code Online (Sandbox Code Playgroud)

现在你可以做以下事情:

  import Pythonians._
  3 < 4 and "foo" == "bar"
Run Code Online (Sandbox Code Playgroud)

但是,帮自己一个忙,而且......不要.如果你"非常喜欢python",为什么不在python中编写代码呢?如果你花时间去学习scala,不妨试试看它自己的语法和习语......谁知道,也许你会比你喜欢python更喜欢它?而其他需要阅读您编写的代码的人将不必理解整个新语言.