带括号和不带括号的函数之间的区别[重复]

2024-04-30

可能的重复:
Scala 中的函数与方法 https://stackoverflow.com/questions/4839537/functions-vs-methods-in-scala
Scala 中 def foo = {} 和 def foo() = {} 有什么区别? https://stackoverflow.com/questions/7409502/what-is-the-difference-between-def-foo-and-def-foo-in-scala

在scala中我们可以定义

def foo():Unit = println ("hello")

or

def foo:Unit = println ("hello")

我知道它们不一样,但有什么区别,什么时候应该使用哪个?

如果之前已回答过此问题,请指出该链接。


可以使用或不使用括号来定义 0 元数的 Scala 2.x 方法()。这用于向用户发出信号,表明该方法有某种副作用(例如打印到标准输出或破坏数据),而不是没有副作用,稍后可以将其实现为val.

See Scala 编程 http://www.artima.com/pins1ed/composition-and-inheritance.html#i1343251059-1:

这种无参数方法在 Scala 中很常见。相比之下,使用空括号定义的方法(例如 def height(): Int)称为空括号方法。推荐的约定是,只要没有参数,就使用无参数方法,并且该方法仅通过读取包含对象的字段来访问可变状态(特别是,它不会更改可变状态)。

该约定支持统一访问原则 [...]

总而言之,Scala 中鼓励将不带参数且无副作用的方法定义为无参数方法,即省略空括号。另一方面,您永远不应该定义一个没有括号的有副作用的方法,因为这样该方法的调用看起来就像一个字段选择。

术语

关于 0 数量方法有一些令人困惑的术语,所以我将在这里创建一个表:

Programming in Scala scala/scala jargon
def foo: Int parameterless methods nullary method
def foo(): Int empty-paren methods nilary method

说“无效方法”可能听起来很酷,但人们常常说错了,读者也会感到困惑,所以我建议坚持使用无参数方法与空括号方法,除非你处于人们已经在使用的拉取请求中行话。

() 在 Scala 2.13 或 3.0 中不再是可选的

In 伟大的()插入 https://github.com/lampepfl/dotty/pull/2716,Martin Odersky 对 Scala 3 进行了更改,要求()调用定义的方法()。这记录在Scala 3 迁移指南 https://scalacenter.github.io/scala-3-migration-guide/docs/incompatibilities/dropped-features.html#auto-application as:

自动应用是调用空方法而不传递空参数列表的语法。

Note: 迁移文档中的术语有误。它应该读作:

自动应用程序的语法是调用空括号(或“nilary”)方法,无需传递空参数列表。

Scala 2.13 遵循 Scala 3.x 并弃用了空括号方法的自动应用如果预期类型为 Function0,则 eta-expand 0-arity 方法 https://github.com/scala/scala/pull/7660。此规则的一个值得注意的例外是 Java 定义的方法。我们可以继续调用Java方法,例如toString没有().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带括号和不带括号的函数之间的区别[重复] 的相关文章

  • 具有两个通用参数的上下文边界

    在 Scala 中 我可以使用上下文边界 def sort T Ordered t Seq T 与以下意思相同 def sort T t Seq T implicit def Ordered T 如果我有一个带有两个泛型参数的类怎么办 IE
  • Akka Stream Graph 恢复问题

    我创建了一个图表来并行化具有相同输入的两个流 这些流产生 Future Option Entity 如果 flowA 失败 我想返回 Future None 但恢复似乎没有被调用 val graph Flow Input Future Op
  • Scala 宏的位置怎么了?

    我试图获取宏参数的原始输入字符串 但返回的位置似乎有点偏离 考虑这个宏 例如 object M import scala reflect macros Context import language experimental macros
  • Scala 的代码覆盖率工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • Play框架:单属性案例类的JSON读取

    我正在尝试为包含单个属性的案例类创建隐式 JSON Reads 但收到错误 Reads Nothing 不符合预期类型 这是代码 import play api libs functional syntax import play api
  • Scala:什么是 CompactBuffer?

    我试图弄清楚 CompactBuffer 的含义 和迭代器一样吗 请解释其中的差异 根据 Spark 的文档 它是 ArrayBuffer 的替代方案 可以提供更好的性能 因为它分配的内存更少 以下是 CompactBuffer 类文档的摘
  • 使用 Scala 获取 Spark 数据集中最新时间戳对应的行

    我对 Spark 和 Scala 比较陌生 我有一个具有以下格式的数据框 Col1 Col2 Col3 Col 4 Col 5 Col TS Col 7 1234 AAAA 1111 afsdf ewqre 1970 01 01 00 00
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • 将 IndexToString 应用于 Spark 中的特征向量

    Context 我有一个数据框 其中所有分类值都已使用 StringIndexer 进行索引 val categoricalColumns df schema collect case StructField name StringType
  • Akka-Streams 收集数据(Source -> Flow -> Flow (collect) -> Sink)

    我对 Scala 和 Akka 完全陌生 我有一个简单的 RunnableFlow Source gt Flow do some transformation gt Sink runForeach 现在我想要这样的东西 Source gt
  • 应对失败的“未来”

    给出以下两种方法 def f Future Int Future 10 def g Future Int Future 5 我想把它们写成 scala gt import scala concurrent Future import sca
  • 在 Spark 结构化流 2.3.0 中连接两个流时,左外连接不发出空值

    两个流上的左外连接不发出空输出 它只是等待记录添加到另一个流中 使用套接字流来测试这一点 在我们的例子中 我们想要发出具有 null 值的记录 这些记录与 id 不匹配或 且不属于时间范围条件 水印和间隔的详细信息如下 val ds1Map
  • XML 创建 - 错误:带有替代方案的重载方法构造函数 UnprefixedAttribute

    scala gt val count 7 count Int 7 将其放入 XML 属性中会出现错误 scala gt val x
  • 如何将 Java 地图转换为在 Scala 中使用?

    我正在开发一个 Scala 程序 该程序调用 Java 库中的函数 处理结果并生成 CSV 有问题的 Java 函数如下所示 Map
  • 如何使用scala获取elasticsearch中_delete_by_query api的状态

    我正在 scala 中向 elasticsearch 发送 HTTP post Http s http elkIp 5051 indexName delete by query postData s query terms zip id k
  • 在spark-kafka中使用schema将ConsumerRecord值转换为Dataframe

    我正在使用 Spark 2 0 2 和 Kafka 0 11 0 并且 我正在尝试在火花流中使用来自卡夫卡的消息 以下是代码 val topics notes val kafkaParams Map String Object bootst
  • Scala 的“神奇”函数列表

    在哪里可以找到 Scala 的 神奇 函数列表 例如apply unapply update etc 魔法函数是指编译器的某些语法糖使用的函数 例如 o update x y lt gt o x y 我用谷歌搜索了一些组合scala mag
  • 将下划线分配给变量。下划线是做什么的?

    最近我遇到了这样的代码 var myVariable variableKind 这似乎是一种分配方式null to myVariable 谁能解释一下背后的理由 在这种情况下 分配之间有什么区别 and null到一个变量 它使用默认值初始
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org

随机推荐