Scala 根据函数调用的位置,可以创建哪些不同类型的函数?

Scala 根据函数调用的位置,可以创建哪些不同类型的函数?,scala,Scala,def atMost(实际值:Int,极限值:Int):Int=max(实际值,极限值) 假设我有一个类似于上述atMost的函数,我必须像这样调用它: atMost(100, 25) // returns 25 val a:Int = 100 atMost 25 如果我想这样称呼它呢: atMost(100, 25) // returns 25 val a:Int = 100 atMost 25 我如何编写这样的函数 另外,您还可以创建其他类似的函数样式吗?就像从左侧读取一样,也可以从

def atMost(实际值:Int,极限值:Int):Int=max(实际值,极限值)

假设我有一个类似于上述atMost的函数,我必须像这样调用它:

atMost(100, 25) // returns 25
val a:Int = 100 atMost 25
如果我想这样称呼它呢:

atMost(100, 25) // returns 25
val a:Int = 100 atMost 25
我如何编写这样的函数


另外,您还可以创建其他类似的函数样式吗?就像从左侧读取一样,也可以从右侧读取?

因此
100 atMost 25
将始终由编译器翻译为
100。atMost(25)

因此,我们可以将您的问题重新表述为“如何向现有类添加一个附加方法”,这个问题的答案是扩展方法(作为一般编程概念)和隐式类(作为我们可以在Scala中使用的建模技术)

如果
隐式
在范围内,您可以
100 atMost 25


另外,您还可以创建其他类似的函数样式吗?就像从左边读一样,从右边读可能吗

另外两个重要的语法规则是

  • 一元方法
  • 和右关联方法
对于第一个字符,您必须将它们命名为
一元字符{S}
,其中
{S}
被替换为单个字符,该字符将作为一元符号。
因此,定义为
一元数的方法
的调用方式如下:
!true
,编译器将其展开为
true.unary\u!()

对于第二个操作数,如果方法名称以
结尾,则在右操作数中调用该方法,而不是在左操作数中调用该方法。

因此,一个定义为
++:
的方法被称为
foo++:bar
,编译器将其扩展为
bar.++:(foo)

Luis Miguel Mejía Suárez解释了如何使用Scala 2中的隐式类向现有类添加方法

我想补充一点,Scala 3将为此引入一种新语法:

扩展名(实际值:Int)
def大气(限值:Int):Int=max(实际,限值)
如您所见,不再需要为此用例创建新类。因此,它更方便,因为您不必提供名称,编辑器的类型搜索不会被这些伪类弄乱,也不会有无用的分配等等

Scala 3将在年底前发布,所以现在是开始准备的时候了:-)