2017-02-03 7 views
0

Я следую вместе с видеофильмом Water Pouring на второй неделе разработки функциональной программы в Scala на Курсере.Получение «значение x не является членом xyz»

Мой код почти идентичен Мартину. Кажется, что он просто компилируется. И я могу создать экземпляр класса на моем листе.

Но когда я проверяю объект, некоторые члены там, а некоторые нет. Я получаю сообщение об ошибке «значение 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?

Любая помощь будет оценена

+0

Ваш код работает нормально. Вы вставляете его в REPL. Проблема, вероятно, связана с IntelliJ, которая, как известно, имеет такое поведение. – pedrofurla

+0

Спасибо @pedrofurla - так как я могу исправить проблему с IntelliJ? –

+0

Использование SBT: http://www.scala-sbt.org/ – pedrofurla

ответ

0

Где-то вдоль линий ожидаемое поведение изменилось. Код, записанный в видео, больше не работает с последним листом Scala в IntelliJ.

Все, что требовалось было удалить обертку object XXX { } вокруг кода, и все работает нормально.

0

Если IntelliJ не отображается элемент должным образом один хак удалить папку .idea и открыть проект снова в IntelliJ. Это может решить проблему. Если это не сработает, попробуйте сделать недействительным кеш-код intelliJ. https://www.jetbrains.com/help/idea/2016.3/cleaning-system-cache.html

+0

Пробовал оба, но безрезультатно. Хуже того, внезапно после последнего обновления, я получал никаких выходных данных. –

+0

Но я в конце концов обнаружил, что кто-то еще опубликовал это, если вы удалите определение внешнего «объекта», оно работает. Я сделал это, и теперь я работаю правильно. Уф. –