是否可以使用infix表示法调用方法?
例如,在Haskell中,我可以编写以下函数:
x `isAFactorOf` y = x % y == 0然后用它就像:
if 2 `isAFactorOf` 10 ...在某些情况下允许非常可读的代码。在Scala中有类似的东西吗?我搜索了"Scala表示法“,但在Scala中,这个术语似乎意味着一些不同的东西。
发布于 2014-12-05 14:02:02
从版本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 { ... }这不会导致装箱,但它比典型的隐式类更具限制性。它只能包含方法,而不能包含值或状态。
发布于 2014-12-05 13:50:58
本质上,在Scala中,您不能以infix方式调用函数,但是可以在类型上定义一个方法,左参数可以隐式转换为该方法。因此,对于您的示例,您可以定义一个类,该类具有一个方法isAFactorOf (接受Int),并指示Int可以隐式转换为该类的一个实例。
如果您查看另一个问题的答案https://stackoverflow.com/a/3119671,您将看到Scala中的语法,它可以等效地工作。
https://softwareengineering.stackexchange.com/questions/264658
复制相似问题