首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Intellij工作表及其中定义的类

Intellij工作表及其中定义的类
EN

Stack Overflow用户
提问于 2015-11-10 12:43:11
回答 1查看 1.2K关注 0票数 7

我正在学习Scala中的函数式编程课程,并出现了工作表爬虫的奇怪行为。

在本课程中,具有下列代码的工作表应在右侧给出下列结果:

代码语言:javascript
运行
复制
object rationals {
val x = new Rational(1, 2)              > x : Rational = Rational@<hash_code>
   x.numer                              > res0: Int = 1
   y. denom                             > res1: Int = 2
}

class Rational(x: Int, y: Int) {
   def numer = x
   def denom = y
}

我得到的是

代码语言:javascript
运行
复制
object rationals {                      > defined module rationals
val x = new Rational(1, 2)              
   x.numer                              
   y. denom                             
}

class Rational(x: Int, y: Int) {        > defined class Rational
   def numer = x
   def denom = y
}

只有在将class移动到object之后,我才得到与代码中相同的结果。

  • 这是因Intellij引起的,还是Scala中发生了更改?
  • 还有别的办法吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-11 06:54:55

在IntelliJ IDEA中,scala工作表处理objects内部的值与Eclipse不同。

对象内的值不以线性顺序模式计算,而是作为普通scala对象处理。在明确使用之前,您几乎看不到有关它的信息。

要实际查看val和表达式,只需在任何对象\类之外定义或计算它们

在某些情况下,这种行为可能是救世主。假设你有这个定义。

代码语言:javascript
运行
复制
  val primes = 2l #:: Stream.from(3, 2).map(_.toLong).filter(isPrime)

  val isPrime: Long => Boolean = 
    n => primes.takeWhile(p => p * p <= n).forall(n % _ != 0)

请注意,isPrime可能是一个简单的def,但出于某种原因,我们选择将其定义为val

这样的代码在任何普通scala代码中都很好,但是在工作表中会失败,因为val的定义是交叉引用的。

但是它将这样的行封装在一些对象中,比如

代码语言:javascript
运行
复制
object Primes {
  val primes = 2l #:: Stream.from(3, 2).map(_.toLong).filter(isPrime)

  val isPrime: Long => Boolean =
    n => primes.takeWhile(p => p * p <= n).forall(n % _ != 0)
}

它将被评估,没有问题。

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

https://stackoverflow.com/questions/33630274

复制
相关文章

相似问题

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