Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 具有两个块的自定义控件结构_Scala - Fatal编程技术网

Scala 具有两个块的自定义控件结构

Scala 具有两个块的自定义控件结构,scala,Scala,我对Scala完全陌生,在阅读一些教程和文档时,我尝试了定义自定义控件结构 因此,我尝试实现一个隐式类MyBoolean,它提供了一个带有两个参数列表的?方法。第一个参数是在MyBoolean为true时执行的块,第二个参数是在MyBoolean为false时执行的块 下面是生成的控件结构的语法的示例: true ? {println("true")} {println("false")}; 所以本质上只是一个简单的if-else语句,作为布尔函数上的方法实现 以下是我的实现: object

我对Scala完全陌生,在阅读一些教程和文档时,我尝试了定义自定义控件结构

因此,我尝试实现一个隐式类
MyBoolean
,它提供了一个带有两个参数列表的
方法。第一个参数是在
MyBoolean
为true时执行的块,第二个参数是在
MyBoolean
为false时执行的块

下面是生成的控件结构的语法的示例:

true ? {println("true")} {println("false")};
所以本质上只是一个简单的if-else语句,作为布尔函数上的方法实现

以下是我的实现:

object Test extends App {
    implicit class MyBoolean(val value: Boolean) {
        def ? (body1: => Unit)(body2: => Unit){
            if (value) body1;
            else body2
        }
    }

    override def main(args: Array[String]): Unit = {
//      true ? {println("true")} {println("false")}; //--> compiler error
      true.? {println("true")} {println("false")}; // works fine...
    }
}
我面临的问题是(在Eclipse中)在使用预期语法时出现以下编译器错误:

缺少方法的参数?在MyBoolean类中;遵循这个方法 如果要将其视为部分应用的函数,请使用“\”

仅当我在方法
之前显式添加点
时,它才起作用


在Scala中调用方法时,点不应该是可选的吗?有什么我遗漏的吗?

这是Scala语法中最奇怪的皱纹之一。您仍然可以对多个参数列表使用无点样式,但必须使用括号(?)对对象、方法和第一个参数列表进行分组

很好用

为什么会这样?使用
/:
:\
折叠符号非常方便;然后您可以将第一个元素与它应该运行的集合组合在一起

就其他方面而言,这充其量也值得怀疑


不管怎样,你要么用括号,要么用圆点。

在调用单参数方法时,圆点是可选的,但这种语法对双参数方法不起作用,即使是curry(除非@RexKerr建议将其括起来)

您可以通过执行“手动”currying使其工作:编写一个单参数方法,该方法返回一个带有apply的对象:

class PartiallyApplied(value: Boolean, body1: => Unit) {
  def apply(body2: => Unit) = if (value) body1; else body2
}

class MyBoolean...
  def ? (body1: => Unit) = new PartiallyApplied(value, body1)
在Scala中调用方法时,点不应该是可选的吗

有点,但这并不准确

在这些情况下,这是真的:

  • a.b(c)
    可以写成
    a.b(c)
  • a.b(c,d)
    可以重写为
    a.b(c,d)
根据第6.12.3节中缀操作:

左关联运算符的右操作数可以由括号中的几个参数组成,例如,e op e1,…,en。该表达式被解释为e.op(e1,…,en)

左关联二进制操作e1 op e2被解释为e1.op(e2)


但是对于
a.b(c)(d)
形式的表达式没有相应的规则。但我不太清楚为什么。在我看来,
a b{c}{d}
将是一种非常合理的写作方式。

我尝试了你的建议,但它导致了同样的问题——即,在使用该方法之前,人们必须仍在原地踏步。无论如何:+1表示正确答案。
class PartiallyApplied(value: Boolean, body1: => Unit) {
  def apply(body2: => Unit) = if (value) body1; else body2
}

class MyBoolean...
  def ? (body1: => Unit) = new PartiallyApplied(value, body1)