Scala - 方法调用语法

Bob*_*r02 11 methods scala

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

1 to 10
Run Code Online (Sandbox Code Playgroud)

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

breakable { ... }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Dan*_*ral 24

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

obj.method(params)   // dot notation
obj method (params)  // operator notation
Run Code Online (Sandbox Code Playgroud)

以上可以通过以下方式进行修改:

  1. 如果params是单个参数,则可以替换(){}.
  2. 如果params是单个参数并且您使用的是运算符表示法,则可以删除括号.
  3. 如果method不接受参数,则可以删除(params)(即删除空()).
  4. 如果method结束:,那么它实际上以运算符表示法绑定到右边.也就是说,(params) method_: obj相当于obj.method_:(params).
  5. 无论哪种方式,只要标识符可以分开,空格就是可选的.因此,可以在点符号中添加空格,例如obj . method ( params ).method(params)在下一行写入- 通常在调用链接中发生 - 以及从运算符表示法中删除空格,如a+b.

还有一些有元组推理的东西,但我尽量避免它,所以我不确定具体的规则.

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

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
Run Code Online (Sandbox Code Playgroud)

好的,现在你给的例子.可以导入稳定值的成员.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
Run Code Online (Sandbox Code Playgroud)

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

method(params)
Run Code Online (Sandbox Code Playgroud)

如果:

  1. method 被导入范围.
  2. 你保留括号(即使只有一个参数)

请注意,还有一个优先问题.如果你写obj method(params),Scala将推测method属于obj,即使它被导入范围.

  • @ acspd7好吧,`()`和`{}`在_expression_中有不同的含义.也就是说,"2*(3 + 4)"和"2*{3 + 4}"具有相同的结果,但是是不同的东西.您只能将表达式放在括号内,而将_definitions_和_statements_放在花括号中,最后一个语句的值是它的表达式值(花括号本身就是表达式).`f(...)`可以用`f {...}`替换的原因就是人们不必写`f({...})`.这允许人们编写看起来像本地的"用户"控制结构. (2认同)

om-*_*nom 15

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

breakable({ ... }) 
Run Code Online (Sandbox Code Playgroud)

这符合签名

breakable: (op: ? Unit): Unit 
Run Code Online (Sandbox Code Playgroud)

并使用如此命名的按名称调用参数(您可能会认为这是将一段代码作为参数传递)

更多scala允许你写这个:

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

scala> foo { println(1) } { println(2) }
1
2
Run Code Online (Sandbox Code Playgroud)

以上是咖喱功能的例子