gpt4 book ai didi

string - Scala String toInt - Int 不带参数

转载 作者:行者123 更新时间:2023-12-02 05:09:25 24 4
gpt4 key购买 nike

所以我正在学习 Scala,并且遇到了这个棘手的问题......

如果我们有一个 String 并想将其转换为 Int,我在网上找到的所有示例都说:“这很简单!只需使用 >String.toInt!”

好的:

var x = readLine().toInt

足够简单。我假设 toInt 是 String 的函数。但如果是这样的话,我应该能够用括号调用 toInt ,对吗?来自 Java,这对我来说感觉更自然:

var x = readLine().toInt()

但是唉! Scala 给我以下错误:

[error] /home/myhome/code/whatever/hello.scala:13: Int does not take parameters

[error] var x = readLine().toInt()

好奇。这个错误是什么意思? toInt 不是 String 的函数吗?同样,为什么我可以两者都做:

var x = readLine().toLowerCase()
var y = readLine().toLowerCase

没有任何问题吗?

编辑:重复的问题没有解决 toLowerCasetoInt 问题。

最佳答案

这是一个好问题,我认为它不能算作 question about defining zero-arity methods 的重复。带或不带括号。

这里 toInttoLowerCase 的区别在于 toInt 是标准库的 StringOps 提供的语法丰富> 类。您可以通过在 REPL 中使用 reifyshowCode 来检查这一点:

scala> import scala.reflect.runtime.universe.{ reify, showCode }
import scala.reflect.runtime.universe.{reify, showCode}

scala> showCode(reify("1".toInt).tree)
res0: String = Predef.augmentString("1").toInt

这只是对丰富方法调用进行脱糖处理,并向您展示应用了哪些隐式转换来支持它。

如果我们看一下toInt method on StringOps ,我们看到它的定义没有括号。正如可能重复问题的答案所指出的,如果 Scala 中的零元数方法在没有括号的情况下定义,则不能用括号调用它(尽管如果用括号定义它,则可以以任何一种方式调用)。

这就是为什么 "1".toInt() 不起作用的原因。如果 String 是遵循正常 Scala 命名约定的普通 Scala 类,则 "ABC".toLowerCase() 也不起作用,因为该方法将在没有括号的情况下定义,因为它没有副作用(这只是一个约定,但它在 Scala 代码中的应用往往相当一致)。

问题是 String 实际上并不是 Scala 标准库中的类,它只是 java.lang.String。在 JVM 级别,使用括号定义的零元方法和不使用括号定义的零元方法之间没有区别 - 这纯粹是 Scala 的区别,并且它没有编码在 JVM 方法签名中,而是存储在存储在 JVM 方法签名中的单独一批元数据中。类文件。

Scala 语言设计者决定将所有未在 Scala 中定义的零元方法(因此没有额外的元数据)视为使用括号定义的方法。由于 String 上的 toLowerCase 方法确实是 java.lang.String 类的方法(而不是像 >toInt),它属于这一类,这意味着你可以用任何一种方式调用它。

关于string - Scala String toInt - Int 不带参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42320394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com