如果这个问题很愚蠢,请谅解。
我开始用基本语法学习scala。
但是我不明白为什么一个是错误而另一个不是。我使用scala工作表对此进行了测试
val range = 1 to 10 by 3 toList
println(s"$range") //error
但是下面是列表(实际上是Seq)
val range = (1 to 10 by 3).toList
println(s"$range") //no problem
我正在使用intellij 2018.2 Ultimate Edit。
编辑:我认为这是intellij版本的问题,但仍然无法正常工作
答案 0 :(得分:1)
应该都可以。在scala中,您可以省略.
并保留用于方法调用的空间,这可能是haskell方法的损坏版本。我认为根据官方文档,不建议在Scala中使用空格-STYLE GUIDE - METHOD INVOCATION
示例:
scala> val data = "guitar"
data: String = guitar
scala> data.toUpperCase
res8: String = GUITAR
您可以使用空格代替.
scala> data toUpperCase
<console>:13: warning: postfix operator toUpperCase should be enabled
by making the implicit value scala.language.postfixOps visible.
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scaladoc for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.
data toUpperCase
^
res9: String = GUITAR
由于.toUpperCase
在不包含.
的数据结构之后使用(称为postfix Operator),因此编译器只是在警告这一点。可以按照警告中的说明进行修复,
scala> import scala.language.postfixOps
import scala.language.postfixOps
scala> data toUpperCase
res10: String = GUITAR
同样的情况适用于您的示例。从可读性的角度来看,点使示例更具可读性。
scala> (1 to 10 by 3).toList
res9: List[Int] = List(1, 4, 7, 10)
此外,后缀运算符可能会导致错误。例如,1 + "11" toInt
在计算结束时应用toInt
,但也许我想要的是1 + "11".toInt
还,关于您的错误,您还需要对编译器大喊大叫,以停止在toList
上用;
进行链接,或者在后缀运算符后换行。或者,您可以在后缀运算符后使用val
,def
,这样编译器现在知道它是不同的上下文。
scala> :paste
import scala.language.postfixOps
val range = 1 to 10 by 3 toList
println(s"$range")
// Exiting paste mode, now interpreting.
List(1, 4, 7, 10)
import scala.language.postfixOps
range: List[Int] = List(1, 4, 7, 10)
答案 1 :(得分:1)
如果遇到此错误...
错误:(2,13)递归惰性值范围需要输入
...这是因为您在不应该使用的位置使用了中缀(无点)表示法。
在println()
之前放置一个空白行,或在toList
之后放置一个分号,它将起作用。
错误的原因是instance.method(argument)
可以变成...
instance method argument
...但是如果您尝试将instance.method
转换为...
instance method
编译器将查找丢失的argument
,直到遇到分号或空白行为止。