我是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)
以上可以通过以下方式进行修改:
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
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)
如果:
method 被导入范围.请注意,还有一个优先问题.如果你写obj method(params),Scala将推测method属于obj,即使它被导入范围.
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)
以上是咖喱功能的例子
| 归档时间: |
|
| 查看次数: |
5261 次 |
| 最近记录: |