2015-10-29 7 views
0

Я ищу, чтобы понять ошибки времени компиляции, сгенерированные с помощью следующего кода Scala:Scala: Вперед ссылки ошибки во время типа шаблону

class MyClass { 
    def determineType(x:Any):String = { 
     x match { 
      case Int => "It's an int." 
      case Float => "It's a Float." 
      case CIn => "It's a CIn without a specifier." 
      case c:CIn => "It's a CIn with a specifier." 
      case DIn=> "It's a DIn without a specifier." // Error:Cannot resolve symbol DIn 
      case d:DIn=> "It's a DIn with a specifier." 
      case _ => "It's something else." 
     } 
    } 
    case class CIn() 
    class DIn 
} // End class definition 

def determineType(x:Any):String = { 
    x match { 
     case Int => "It's an int" 
     case Float => "It's a Float" 
     case COut => "It's a COut without a specifier." // Error: Wrong forward reference 
     case c:COut => "It's a COut with a specifier." 
     case DOut=> "It's a DOut without a specifier." // Error: Cannot resolve symbol DOut. 
     case d:DOut=> "It's a DOut with a specifier." 
     case _ => "It's something else." 
    } 
} 

case class COut() 
class DOut() 

В версии determineType в MyClass, как case classCIn, как а регулярные class DIn определены и объявлены после determineType. При попытке сопоставления с DIn возникает ошибка разрешения символа без переменной спецификатора.

В области сценария мы также определяем case classCout и обычный classDOut. В версии сценария determineType мы имеем две разные ошибки. Первый генерируется при обращении к типу case class (Cout) без спецификатора, и он читает «Неправильное прямое обращение». Вторая генерируется при обращении к регулярному class (DOut) без спецификатора, и это ошибка разрешения символа.

Я новичок в языке и поэтому не уверен, почему включение спецификаторов в операторы case влияет на способ обработки обратных ссылок.

ответ

2

Если запись оговорка матча case Foo => вы не соответствующие для типа (или класса) Foo но значенияFoo. Таким образом, case Int => делает не совпадение для целочисленного значения, а case DIn => не работает, потому что нет значения (или объекта) DIn.

следующие работы:

val Foo = 1 
object Bar 

def testVal(x: Any) = x match { 
    case Foo => "it's Foo" 
    case Bar => "it's Bar" 
    case _ => "none of the above" 
} 

testVal(1) // Foo! 
testVal(Bar) // Bar 
testVal(Foo + 1) // none 

Если вы хотите, чтобы соответствовать для экземпляра класса вместо этого, вам нужно соответствовать для пункта case b: Baz => или case _: Baz (если вы не заинтересованы в связывании экземпляра к стоимость). Для классов случаев вы можете дополнительно использовать автоматически предоставленный экстрактор, поэтому с case class Baz() вы также можете встретить case Baz() =>. Это, как правило, имеет больше смысла, когда Baz содержит аргументы, которые настоящее экстрагированных:

case class Baz(i: Int) 

def testType(x: Any) = x match { 
    case Baz(3) => "Baz with argument 3" 
    case b: Baz => "Baz with argument other than 3" 
    case Baz => "Baz companion!" 
    case _  => "none of the above" 
} 

testType(Baz)  // companion object! 
testType(Baz(3)) 
testType(Baz(4)) 

Класс случая также дает компаньон object так вот вы могли бы на самом деле соответствовать для этого объекта с помощью case Baz =>. Значение object - это своего рода ценность.


Наконец, я не знаю, какую версию Scala вы используете, но в обычном текущем Scala, вы не можете пропустить match ключевое слово на РИТ вашего определения determineType:

def determineType(x: Any): String = { 
    case _ => "anything" 
} 
<console>:53: error: missing parameter type for expanded function 
The argument types of an anonymous function must be fully known. (SLS 8.5) 
Expected type was: String 
      def determineType(x: Any): String = { 
              ^

Вы должны написать:

def determineType(x: Any): String = x match /* ! */ { 
    case _ => "anything" 
} 
+0

Удивительный ответ, спасибо. В вашем последнем комментарии я фактически отредактировал сообщение, чтобы включить ключевое слово «match».Поскольку на вышеупомянутых строках IntelliJ появились ошибки времени компиляции, я даже не запускал сценарий, чтобы он жаловался на недостающее ключевое слово, и сосредоточился на тех, которые появляются. – Jason

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

  • Нет связанных вопросов^_^