得到“价值x不是xyz的成员”

时间:2017-02-03 02:29:40

标签: scala intellij-idea compiler-errors

我正在跟随Coursera的Scala课程中功能性课程设计第2周的Water Pouring视频。

我的代码几乎与Martin的相同。它似乎编译得很好。我能够在我的工作表中实例化该类的实例。

但是当我检查对象时,有些成员在那里,有些则没有。我得到一个错误“值initialPath不是water.Pouring的成员”

这是我的代码:

class Pouring(val capacity : Vector[Int] ) {

  type State = Vector[Int]

  val initialState : State = capacity map ( x => 0 )

  // Moves
  trait Move {
    def change( state : State ) : State
  }
  case class Empty( glass: Int )        extends Move {
    def change( state: State ) = state updated( glass, 0 )
  }
  case class Fill( glass: Int )         extends Move {
    def change( state: State ) = state updated( glass, capacity( glass ) )
  }
  case class Pour( from: Int, to: Int ) extends Move {
    def change( state: State ) = {
      val amount = state(from) min (capacity(to) - state(to))
        state.updated( from, state(from) - amount )
             .updated( to,   state(to)   + amount )
    }
  }

  class Path(history: List[Move]) {
    def endState : State = (history foldRight initialState)(_ change _)
    def extend(move: Move) = new Path( move :: history )
    override def toString = (history.reverse mkString " ") + " => " + endState
  }

  val initialPath = new Path(Nil)

  val glasses = capacity.indices

  val moves =
    ( for ( g <- glasses ) yield Empty(g) ) ++
    ( for ( g <- glasses ) yield Fill(g) ) ++
    ( for ( from <- glasses ; to <- glasses if from != to ) yield Pour(from,to) )


  def from( paths: Set[Path] ): Stream[Set[Path]] =
    if ( paths.isEmpty ) Stream.empty
    else {
      val more = for {
        path <- paths
        move <- moves
      } yield path.extend( move )
      paths #:: from( more )
    }

  val pathSets = from(Set(initialPath))

}

我的工作表很简单:

object testing {
  val problem = new Pouring(Vector(4, 7))

  problem.initialState // works
  problem.glasses      // works
  problem.moves        // works
  problem.initialPath  // fails
  problem.pathSets     // fails
}

我没有弄到什么问题。 IDE(IntelliJ)自动完成了成员名称,为什么它抱怨它不是成员?我遇到过Scala错误吗?还是一个IntelliJ错误?

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

如果intelliJ没有正确显示该成员,则一个hack就是删除.idea文件夹并在intelliJ中重新打开该项目。它可能会解决问题。如果这不起作用,您可以尝试使intelliJ的缓存无效。 https://www.jetbrains.com/help/idea/2016.3/cleaning-system-cache.html

答案 1 :(得分:0)

在某些地方,预期的行为发生了变化。视频中编写的代码不再适用于IntelliJ中的最新Scala工作表。

所需要的只是删除代码周围的object XXX { }包装器,一切正常。