Scala中缀表示法


12

是否可以使用中缀符号来调用方法?

例如,在Haskell中,我可以编写以下函数:

x `isAFactorOf` y = x % y == 0

然后像这样使用它:

if 2 `isAFactorOf` 10 ...

在某些情况下,这允许非常可读的代码。在Scala中可能有与此类似的东西吗?我搜索了“ Scala中缀表示法”,但是该术语似乎在Scala中表示不同的含义。

Answers:


15

从版本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 { ... }

这不会引起装箱,但是比典型的隐式类更具限制性。它只能包含方法,不能包含值或状态。


2
您可能应该提到,隐式类不能是顶级的,因此隐式类将需要在本地定义。
Carcigenicate 2014年

3

本质上,在Scala中,您不能以infix的方式调用函数,但是可以在类型上定义一个方法,可以将其左参数隐式转换为该方法。因此,对于您的示例,您可以定义一个具有isAFactorOf方法的类(采用一个Int),并指示可以将Int隐式转换为此类的实例。

如果您在另一个问题/programming//a/3119671上看到此答案,您将在Scala中看到等效的语法。


值得指出的是,Scala的新版本对此具有明确的构造,链接的答案没有解决:implicit class RichInt(i: Int) { def square() = i * i }
KChaloux 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.