首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala infix符号

Scala infix符号
EN

Software Engineering用户
提问于 2014-12-05 13:41:23
回答 2查看 6K关注 0票数 14

是否可以使用infix表示法调用方法?

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

代码语言:javascript
复制
x `isAFactorOf` y = x % y == 0

然后用它就像:

代码语言:javascript
复制
if 2 `isAFactorOf` 10 ...

在某些情况下允许非常可读的代码。在Scala中有类似的东西吗?我搜索了"Scala表示法“,但在Scala中,这个术语似乎意味着一些不同的东西。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2014-12-05 14:02:02

从版本2.10开始,Scala引入了隐式类来精确地处理这个问题。

这将对给定类型执行对包装类的隐式转换,该类可以包含您自己的方法和值。

在你的具体情况下,你会用到这样的东西:

代码语言:javascript
复制
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的子类来解决这一问题:

代码语言:javascript
复制
implicit class RichInt(val x: Int) extends AnyVal { ... }

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

票数 17
EN

Software Engineering用户

发布于 2014-12-05 13:50:58

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

如果您查看另一个问题的答案https://stackoverflow.com/a/3119671,您将看到Scala中的语法,它可以等效地工作。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/264658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档