def atMost(actual: Int, limit: Int): Int = max(actual, limit)
假设我有一个像上面这样的函数atMost,我必须这样称呼它:
atMost(100, 25) // returns 25
Run Code Online (Sandbox Code Playgroud)
如果我想这样称呼它怎么办:
val a:Int = 100 atMost 25
Run Code Online (Sandbox Code Playgroud)
我将如何编写这样的函数?
此外,您还可以创建哪些其他风格的函数?像从左读,从右读可能吗?
所以100 atMost 25总是会被编译器翻译为100.atMost(25).
因此,我们可以将您的问题重新表述为“我们如何向现有类添加附加方法”,该问题的答案将是扩展方法 (作为一般编程概念)和隐式类 (作为我们可以在其中使用的技术) Scala 来建模)。
// AnyVal to avoid instantiation cost & private val to hide an useless actual extension method.
implicit class IntOps (private val actual: Int) extends AnyVal {
def atMost(limit: Int): Int = max(actual, limit)
}
Run Code Online (Sandbox Code Playgroud)
如果这implicit在范围内,您可以100 atMost 25。
此外,您还可以创建哪些其他风格的函数?像从左读,从右读可能吗?
另外两个重要的句法规则是。
对于第一个,您必须将它们命名为unary_{S}where{S}替换为单个字符,这将是一元符号。
因此,定义为的方法unary_!将被调用为:!true,编译器将其扩展为true.unary_!()。
对于第二个,如果方法名称以 结尾,:则在右侧操作数而不是左侧操作数中调用该方法。
因此,定义为的方法++:将被调用foo ++: bar,编译器将其扩展为bar.++:(foo)。