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将在年底前发布,所以现在是开始准备的时候了:-)