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