def 不带参数

发布于 2024-11-04 22:16:13 字数 276 浏览 0 评论 0原文

如果我创建一个函数:

def a(): String = return "some string"

结果将是“a: ()String” 所以我可以使用它带/不带括号

另一方面,如果我创建相同的函数

def a:String = return "some other string"

它只是“a:String” 在这种情况下,我不能将它与括号一起使用。

这两者有什么区别?

If I create a function:

def a(): String = return "some string"

the result would be "a: ()String"
So I can use it with/without brackets

On the other hand if I create the same function

def a:String = return "some other string"

It would be just "a: String"
and in this case I can't use it with brackets.

What is the difference between these two?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

依 靠 2024-11-11 22:16:13

好的实践建议定义没有 () 的没有副作用的函数,并在函数有副作用时在定义站点和调用站点添加 ()(例如, println() 而不是 println)。

Good practice recommends defining functions that have no side effect without (), and to add the () both at definition site and call site when the function has side effects (e.g., println() rather than println).

一杯敬自由 2024-11-11 22:16:13

如果像这样定义a,不带括号(注意,return关键字不是必需的):

def a: String = "some other string"

然后用括号调用它:a(),则 () 不是方法 a 的空参数列表;相反,Scala 会尝试将 () 应用于方法 a 返回的字符串。当您尝试这样做时收到的错误消息暗示:

scala> a()
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
       a()
        ^

因此,在第二种情况下,a() 的含义与第一种情况不同。在第一种情况下,它仅意味着“使用空参数列表调用 a”,在第二种情况下,它意味着“调用 a,然后应用 () 到方法的结果”,这将在 String 上失败。

编辑要在下面的评论中扩展您的第二个问题,这取决于您所说的“同一件事”的确切含义。正如您在 REPL 中看到的,其中一个看起来像是 ()java.lang.String 类型,而另一个则具有 java.lang.String 类型。看一下下面的内容,其中 xy 变成了同样的东西:

scala> def a() = "aaa"
a: ()java.lang.String

scala> def b = "bbb"
b: java.lang.String

scala> val x = a _
x: () => java.lang.String = <function0>

scala> val y = b _
y: () => java.lang.String = <function0>

If you define a like this, without parentheses (note, the return keyword is not necessary):

def a: String = "some other string"

and then call it with parenthesis: a(), then the () is not the empty argument list for the method a; instead, Scala will try to apply the () to the String that method a returns. The error message that you get when you try that hints to that:

scala> a()
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
       a()
        ^

So, in the second case, a() means something else than in the first case. In the first case, it just means "call a with an empty argument list", and in the second case it means "call a, then apply () to the result of the method", which will fail on a String.

edit To expand on your second question in the comments below, it depends on what exactly you mean by "the same thing". As you saw in the REPL one looks like it has the type ()java.lang.String while the other has the type java.lang.String. Have a look at the following, in which x and y turn into the same thing:

scala> def a() = "aaa"
a: ()java.lang.String

scala> def b = "bbb"
b: java.lang.String

scala> val x = a _
x: () => java.lang.String = <function0>

scala> val y = b _
y: () => java.lang.String = <function0>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文