我是Scala的初学者,我看到了一些调用方法的不同语法。有些很好,因为忽略无参数方法的括号,或忽略
中的点1 to 10
但有些人真的很困扰我。例如:
breakable { ... }
这只是一个方法调用对吗?我是否可以为多个参数或不是无参数函数的参数执行此操作?
由于
答案 0 :(得分:23)
调用方法有两种标准方法:
obj.method(params) // dot notation
obj method (params) // operator notation
可以通过以下方式修改上述内容:
params
是单个参数,则可以将()
替换为{}
。params
是单个参数和,您使用的是运算符表示法,则可以删除括号。method
没有参数,您可以删除(params)
(即删除空()
)。method
以:
结尾,则它实际上会以操作符号绑定到正确的。也就是说,(params) method_: obj
相当于obj.method_:(params)
。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
好的,现在给你的例子。可以导入稳定值的成员。 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)
如果:
method
已导入范围。请注意,这也是一个优先问题。如果您编写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
以上是咖喱功能的例子