Answers:
从版本2.10开始,Scala引入了隐式类来精确处理此问题。
这将对给定的类型执行隐式转换,将其转换为可包含您自己的方法和值的包装类。
在您的特定情况下,您将使用以下方式:
implicit class RichInt(x: Int) {
def isAFactorOf(y: Int) = x % y == 0
}
2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10
请注意,在编译时,这最终会将我们的原始值装箱到中RichInt(2)
。您可以通过将RichInt声明为以下内容的子类来解决此问题AnyVal
:
implicit class RichInt(val x: Int) extends AnyVal { ... }
这不会引起装箱,但是比典型的隐式类更具限制性。它只能包含方法,不能包含值或状态。
本质上,在Scala中,您不能以infix的方式调用函数,但是可以在类型上定义一个方法,可以将其左参数隐式转换为该方法。因此,对于您的示例,您可以定义一个具有isAFactorOf方法的类(采用一个Int),并指示可以将Int隐式转换为此类的实例。
如果您在另一个问题/programming//a/3119671上看到此答案,您将在Scala中看到等效的语法。
implicit class RichInt(i: Int) { def square() = i * i }
。