Scala - 方法调用语法

时间:2012-08-10 09:49:07

标签: scala methods

我是Scala的初学者,我看到了一些调用方法的不同语法。有些很好,因为忽略无参数方法的括号,或忽略

中的点
1 to 10

但有些人真的很困扰我。例如:

breakable { ... }

这只是一个方法调用对吗?我是否可以为多个参数或不是无参数函数的参数执行此操作?

由于

2 个答案:

答案 0 :(得分:23)

调用方法有两种标准方法:

obj.method(params)   // dot notation
obj method (params)  // operator notation

可以通过以下方式修改上述内容:

  1. 如果params是单个参数,则可以将()替换为{}
  2. 如果params是单个参数,您使用的是运算符表示法,则可以删除括号。
  3. 如果method没有参数,您可以删除(params)(即删除空())。
  4. 如果method:结尾,则它实际上会以操作符号绑定到正确的。也就是说,(params) method_: obj相当于obj.method_:(params)
  5. 无论哪种方式,只要标识符可以分开,空格就是可选的。因此,可以在点符号上添加空格,例如obj . method ( params )或在下一行写.method(params) - 通常在调用链接中发生 - 以及从运算符表示法中删除空格,如a+b
  6. 还有一些带有元组推理的东西,但我尽量避免它,所以我不确定具体的规则。

    然而,这些都不会解释您感到困惑的例子。然而,在我解释它之前,我想展示一些也可以用来调用方法的语法糖:

    obj(params) // equivalent to obj.apply(params)
    obj.x = y   // equivalent to obj.x_=(y), if obj.x also exists
    obj(x) = y  // equivalent to obj.update(x, y)
    obj op= y   // equivalent to obj = obj op y, if op is symbolic
    ~obj        // equivalent to obj.unary_~; also for !, + and -, but no other symbol
    

    好的,现在给你的例子。可以导入稳定值的成员。 Java可以通过静态导入来实现静态方法,但Scala有一个更通用的机制:从包,对象或公共实例导入也没有什么不同:它带来了类型成员和值成员。方法属于后一类。

    所以,假设你有val a = 2,而你import a._。这将涵盖所有Int方法的范围,因此您可以直接调用它们。您无法+(2),因为这会被解释为对unary_+的调用,但您可以调用*(4),例如:

    scala> val a = 2
    a: Int = 2
    
    scala> import a._
    import a._
    
    scala> *(4)
    res16: Int = 8
    

    现在,这是规则。你可以打电话

    method(params)
    

    如果:

    1. method已导入范围。
    2. 您保留括号(即使只有一个参数)
    3. 请注意,这也是一个优先问题。如果您编写obj method(params),Scala会假定method属于obj,即使它已导入范围。

答案 1 :(得分:15)

如果我们厌倦了这个,我们将会:

breakable({ ... }) 

匹配签名

breakable: (op: ⇒ Unit): Unit 

并使用如此命名的 call-by-name 参数(您可以将其视为将一段代码作为参数传递

更多scala允许你写这个:

scala> def foo (op1: => Unit)(op2: => Unit) = {op1;op2;}
foo: (op1: => Unit)(op2: => Unit)Unit

scala> foo { println(1) } { println(2) }
1
2

以上是咖喱功能的例子