2013-08-14 3 views
2

Я сделал изменение кода в классе Scala, который работал нормально. При попытке компиляции модификации, компилятор выплюнуть сообщение об ошибке, «значение не является членом Int» в связи с этим (уже существующие) строки кода:Диагностика ошибки компиляции Scala «значение не является членом Int»

for (i <- 0 to cColumn -1) { ... } 

Выполнение некоторых исследований, я пришел через некоторые сообщения об ошибках по методу «to», а также что «to» по-видимому является методом, предоставляемым внутри класса intWrapper (?).

Итак, основываясь на этой информации, я начал рассматривать операторы импорта своего класса ... нет такого импорта для intWrapper. (Q: В этом случае, как это вообще было скомпилировано/выполнялось в первую очередь?) Что делает это еще более интересным (для меня), так это то, что когда я начал выполнять глобальный поиск в базе кода для этого импорта, я случайно закончил сеанс компилятора (sbt) ... но когда я перезапустил его, класс скомпилирован просто отлично. Никаких ошибок. (И никаких изменений кода с предыдущего сеанса)

У кого-нибудь есть идеи относительно того, что может вызвать это прерывистое поведение?

ПРИМЕЧАНИЕ:
1) с помощью Scala 2.10.2 с JAVAC 1.7.0_25
2) изменение кода к классу не имело ничего общего с функциональностью, например, а также не изменять какие-либо импорт класса

Update: Вот объявление переменное:

val meta = rs.getMetaData() 
val cColumn = meta.getColumnCount() 

EDIT: За предложение, вот тестовые линии (все из них скомпилироваться сейчас):

implicitly[scala.Int => scala.runtime.RichInt] 
intWrapper(3) to 4 
for (i <- 0 to 33 -1) { /* do something smart */ } 

for (i <- 0 to cColumn -1) { ... } 

EDIT 2 Вот полная ошибка компилятора:

[error] /path/to/src/file/DBO.scala:329: value to is not a member of Int 
[error]  for (i <- 0 to cColumn -1) { 
[error] 

Эта ошибка повторялась ~ 18 раз в классе. (Это уровень интерфейса DBO-DB); где DBO.scala - это файл, содержащий недавно измененный признак.

+1

Что такое 'cColumn' – Jatin

+0

Это Int. (Я обновил вопрос, чтобы показать объявления.) – mjk

ответ

1

how did this ever compile/run in the first place?

По умолчанию импортировано содержимое scala.Predef. Там у вас есть метод intWrapper, который производит RichInt способом to.

Возможно, у вас есть затененный символ intWrapper. Имеет следующие работы:

implicitly[scala.Int => scala.runtime.RichInt] 

или это:

intWrapper(3) to 4 

... если нет, там лежит ваша проблема.


EDIT: Так, так как вы говорите, что компилирует, что происходит, вы замените cColumn с константой, например,

for (i <- 0 to 33 -1) { ... } 

? Это также поможет опубликовать полное сообщение компилятора с указанной линией и т.д.

+0

yep, обе эти строки компилируются без проблем. Если я правильно понимаю (у меня есть только 6-месячное кодовое время в Scala), похоже, что нет ничего структурно неправильного с кодом, но скорее это, вероятно, просто «сбой» в системе сборки, скорее всего, связанный к неявному импорту (например, к поврежденному пути класса)? – mjk

+0

Если эти две строки компилируются _ в том же контексте_ вашего выражения 'for', которое _fails_, тогда я не знаю, что происходит. –

+0

Я разместил их непосредственно перед оператором примера, и они скомпилировали ОК. На данный момент я думаю, что это должно быть связано с глюком/ошибкой, что является моей единственной заботой - убедитесь, что я не пропустил что-то структурно внутри самой кодовой базы. Спасибо за предложения. – mjk

0

Не зная, где эта ошибка приходит, вы можете также попытаться обойти его, построив Range вручную:

for (i <- Range.inclusive(0, cColumn-1)) { ... } 

или

Range.inclusive(0, cColumn-1).foreach { i => ... } 
+0

Это намного больше соответствует моему образу мышления (теперь, когда у меня была возможность получить хотя бы некоторые знания языка). – mjk

3

Я только что столкнулся с этой же проблемой. В моем случае, это было вызвано ненужной import, как это:

import scala.Predef.String 

class Test() { 
    for (t <- 1 to 3) {} 
} 

По умолчанию Scala импортирует все scala.Predef. Predef расширяет LowPriorityImplicits, который включает неявное преобразование от Int до RichInt.

to фактически определен на RichInt, поэтому вам необходимо это преобразование, чтобы использовать его. Импортируя только часть Predef, я теряю это преобразование. Избавьтесь от ненужного import и ошибка исчезнет.

Смежные вопросы