重写Scala&&;至及

重写Scala&&;至及,scala,Scala,我正试图用以下方式将Scala的&重写为和(我喜欢python,这就是我尝试这样做的原因): 但是,当我尝试使用它时,例如: def and(p1: () => Boolean, p2: () => Boolean): Boolean = p1() && p2() if ((l < h.length) and (h(l) > h(i))) 这是怎么回事?做你想做的事情的方法是这样的: object Pythonians { implicit

我正试图用以下方式将Scala的
&
重写为
(我喜欢python,这就是我尝试这样做的原因):

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

def and(p1: () => Boolean, p2: () => Boolean): Boolean = p1() && p2()
if ((l < h.length) and (h(l) > h(i)))

这是怎么回事?

做你想做的事情的方法是这样的:

  object Pythonians {
    implicit class Bool(val b: Boolean) extends AnyVal { 
      def and(p: => Boolean) = b && p
    }
  }
现在,您可以执行以下操作:

  import Pythonians._
  3 < 4 and "foo" == "bar"
导入Pythonians_
3<4且“foo”=“bar”
但是,帮你自己一个忙,然后。。。不要。 如果你如此“热爱python”,为什么不用python编写代码呢?如果您正在花时间学习scala,不妨尝试一下它自己的语法和习惯用法。。。谁知道呢,也许你会越来越喜欢它而不是python?
而其他需要阅读您编写的代码的人也会感激您不必了解整个新语言。

实现您所需的方法如下:

  object Pythonians {
    implicit class Bool(val b: Boolean) extends AnyVal { 
      def and(p: => Boolean) = b && p
    }
  }
现在,您可以执行以下操作:

  import Pythonians._
  3 < 4 and "foo" == "bar"
导入Pythonians_
3<4且“foo”=“bar”
但是,帮你自己一个忙,然后。。。不要。 如果你如此“热爱python”,为什么不用python编写代码呢?如果您正在花时间学习scala,不妨尝试一下它自己的语法和习惯用法。。。谁知道呢,也许你会越来越喜欢它而不是python?
而其他需要阅读您编写的代码的人也会感激您不必去理解整个新语言。

根据您的定义,您可以将其称为

and(() => l < h.length, () => h(l) > h(i))

这意味着您传递了一个类型为
Boolean
的表达式作为参数,但与往常一样,在调用方法之前不会对其进行计算,而是在使用它的位置进行计算。因此,在这种情况下,如果
p1
的计算结果为
false
p2
将永远不会被计算,就像
&
使用您的定义一样,您将其称为

and(() => l < h.length, () => h(l) > h(i))


这意味着您传递了一个类型为
Boolean
的表达式作为参数,但与往常一样,在调用方法之前不会对其进行计算,而是在使用它的位置进行计算。因此,在这种情况下,如果
p1
的计算结果为
false
p2
将永远不会被计算,就像
&

所示的
不是布尔的成员,定义其第一个参数为
()=>布尔
不会使其成为
布尔的类型的成员。。。因此,我必须以某种方式编写一个
隐式
,以使
布尔值
一起使用?通常隐式转换过于自动,降低了可读性请记住
&
具有不同的优先级。将一个更改为另一个可能会改变程序的含义。可能不是个好主意。@AlvaroCarrasco-是的,我确实注意到优先级不一样。有没有办法操纵Scala中运算符的优先级(我想没有)?正如前面所指出的
不是布尔的成员,定义它的第一个参数是
()=>布尔的
并不意味着它是
布尔的
@cchantep类型的成员-很好。。。因此,我必须以某种方式编写一个
隐式
,以使
布尔值
一起使用?通常隐式转换过于自动,降低了可读性请记住
&
具有不同的优先级。将一个更改为另一个可能会改变程序的含义。可能不是个好主意。@AlvaroCarrasco-是的,我确实注意到优先级不一样。有没有办法操纵Scala中运算符的优先级(我认为没有)?这里有一个问题。我试过了,它没有
&
的语义,而是
&
:-)@Frank我不知道你在说什么。什么是“语义的&”和什么是“语义的&”
&
是一个按位运算符。我不知道你所说的“语义”是什么意思,但这
绝对不是
&
。是的,
&
具有评估两侧的效果,而
&
如果左侧为假则不评估右侧()。上面提供的代码总是对两边都求值(我试过了)。要完全替换
&&
,如果左侧的计算结果为false,则不应计算右侧的值。@Frank否,它不计算两侧的值。你“尝试”了一些错误:)我收回我的评论:我剪切并粘贴了你的代码,我再也看不到右边的计算了。我一定是在什么地方出错了(比如用
()=>布尔值而不是
:=>布尔值)。我试过了,它没有
&
的语义,而是
&
:-)@Frank我不知道你在说什么。什么是“语义的&”和什么是“语义的&”
&
是一个按位运算符。我不知道你所说的“语义”是什么意思,但这
绝对不是
&
。是的,
&
具有评估两侧的效果,而
&
如果左侧为假则不评估右侧()。上面提供的代码总是对两边都求值(我试过了)。要完全替换
&&
,如果左侧的计算结果为false,则不应计算右侧的值。@Frank否,它不计算两侧的值。你“尝试”了一些错误:)我收回我的评论:我剪切并粘贴了你的代码,我再也看不到右边的计算了。我一定是在什么地方出错了(比如用
()=>布尔值而不是
:=>布尔值),这不是我观察到的,或者我在什么地方出错了。我使用了这段代码,得到了一个与评估
的左侧和右侧相关的bug。我将再次检查,我一定是在某个地方犯了一个错误。如上所述,我最初在语法上犯了一个错误。我不是这样