рд╕реНрдХрд╛рд▓рд╛ 2.11.0 рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдХреНрд╡рд╛рд╕реА-рдЙрджреНрдзрд░рдг

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╣реБрдд рдкрд╣рд▓реЗ, Scala 2.11.0 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрд░реНрдз-рдЙрджреНрдзрд░рдг рд╣реИ - рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдкрд╛рд░рд╕ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХрд╛рд▓рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрдбрд╝реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░; рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рддрдВрддреНрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред



рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдЬрдмрдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдореИрдХреНрд░реЛрдВ рдХрд╛ рд╡рд┐рд╖рдп рдЕрднреА рднреА рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ; рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ

рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЧрдВрднреАрд░ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реЗ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╣реА рдерд╛ред



рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо JSON рдбрд┐рд╕реЗрд░рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореИрдХреНрд░реЛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдкрд░ рдПрдХ рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред



рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди



Scala - spray.json рдХреЗ рд▓рд┐рдП JSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред



рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рд╕реЗрд░реНрдмрд▓рд╛рдЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдпрд╛рдд рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ:



//  ,   : case class MyClass(field: String) //   spray.json: import spray.json._ import DefaultJsonProtocol._ implicit val myClassFormat = jsonFormat1(MyClass) val json = """{ "field\": "value" }""" val obj = json.parseJson.convertTo[MyClass] // ok
      
      





рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛? рдФрд░ рдЕрдЧрд░ рд╣рдо рдкреВрд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдореИрдВ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:



 abstract sealed class Message() case class SimpleMessage() extends Message case class FieldMessage(field: String) extends Message case class NestedMessage(nested: Message) extends Message case class MultiMessage(field: Int, nested: Message) extends Message
      
      





рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧ рдЕрдореВрд░реНрдд рдЬрдирдХ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдбрд┐рд╕реЗрд░рд░рд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп, JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ type



рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдФрд░ рдбреАрд╕рд░реНрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдлрд╝реАрд▓реНрдб рдкрд░ рдбрд┐рд╕реНрдкреИрдЪ рдХрд░рдирд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



 json.type match { case "SimpleMessage" => SimpleMessage() case "FieldMessage" => FieldMessage(json.field) // ... }
      
      





Spray.json рд▓рд╛рдЗрдмреНрд░реЗрд░реА RootJsonFormat



рдлреЙрд░реНрдореЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ JSON рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдореЗрдЯрд░ рдХрд╛ рдореВрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:



 val typeName = ... typeName match { case "FieldMessage" => map.getFields("field") match { case Seq(field) => new FieldMessage(field.convertTo[String]) } case "NestedMessage" => map.getFields("nested") match { case Seq(nested) => new NestedMessage(nested.convertTo[Message]) } case "MultiMessage" => map.getFields("field", "nested") match { case Seq(field, nested) => new MultiMessage(field.convertTo[Int], nested.convertTo[Message]) } case "SimpleMessage" => map.getFields() match { case Seq() => new SimpleMessage() } }
      
      





рдпрд╣ рдХреЛрдб рдереЛрдбрд╝рд╛ рджрд┐рдЦрддрд╛ рд╣реИ ... рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯред рдпрд╣ рдПрдХ рдорд╣рд╛рди рд╕реНрдереВрд▓ рдХрд╛рд░реНрдп рд╣реИ! рд▓реЗрдЦ рдХрд╛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ рдЬреЛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ Message



рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред



рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрдЧрдарди


рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрд╣рд▓реА рдмрд╛рдзрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдПрд╕рдмреАрдЯреА рдореИрдХреНрд░реЛ рдФрд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрд╕рдмреАрдЯреА рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред



рдореИрдХреНрд░реЛ рдХреЛрдб рдФрд░ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЛ рджреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдореБрдЦреНрдп project/Build.sbt



. project/Build.sbt



рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЗ рддреИрдпрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдХреЛрдб рдореЗрдВ рдХреА рдЧрдИ рд╣реИ, рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:





рдПрдХ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдореИрдХреНрд░реЛ рдХреЛ рдПрдХ рд╢реНрд░реЗрдгреА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрджрд╛рдиреБрдХреНрд░рдо рдЙрд╕ рд╕рдордп рдЬреНрдЮрд╛рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдлрд╛рдЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдХреНрд░рдо рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╛ рддреЛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдореИрдХреНрд░реЛ рдХреЛ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬрдмрдХрд┐ рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрднреА рднреА рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рдпрд╛ рдмрд╕ рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛред



рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп, -Ymacro-debug-lite



рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдк -Ymacro-debug-lite



рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рднреА рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рддреИрдирд╛рддреА рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдпреЗ рдкрд░рд┐рдгрд╛рдо рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдЕрдХреНрд╕рд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдмрд┐рдирд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЧреИрд░-рддреБрдЪреНрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ)ред



рдореИрдХреНрд░реЛ



рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рддрд░рд╣ рдмрд╣реБрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдХреЗрд▓ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдПрдкреАрдЖрдИ рдЬрд╛рд╡рд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рднреА рд╕реНрдХрд╛рд▓рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред



рд╕реНрдХрд╛рд▓рд╛ рдХрд╛ рдореИрдХреНрд░реЛ рдЗрдВрдЬрди рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХреЛрдб рдХреЗ рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдХреЛрдб рдХреЗ рдЕрдиреБрд░реВрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрдбрд╝реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╕реНрдХрд╛рд▓рд╛ рдореИрдХреНрд░реЛрдЬрд╝ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рд╕реА рднрд╛рд╖рд╛ рдореИрдХреНрд░реЛрдЬрд╝ рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВред



рд╕реНрдХрд╛рд▓рд╛ рдореИрдХреНрд░реЛрдВ Context



рдХреНрд▓рд╛рд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрд╢рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ рдореИрдХреНрд░реЛ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рдЗрд╕рдореЗрдВ рд╕реЗ Universe



рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░реВрдиреА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд░рдирдЯрд╛рдЗрдо рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдореЗрдВ - рд╡рд╣рд╛рдБ рдХреЗ рдкреНрд░рдХрд╛рд░, рд╡рд┐рдзрд┐рдпреЛрдВ, рдЧреБрдгреЛрдВ рдЖрджрд┐ рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рдЖрдкрдХреЛ Literal



, Constant



, List



, рдЖрджрд┐ рдЬреИрд╕реЗ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ



рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдореИрдХреНрд░реЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдореИрдХреНрд░реЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦреЗрдВ:



 import scala.language.experimental.macros import scala.reflect.macros.blackbox.Context import spray.json._ object Parsers { def impl[T: c.WeakTypeTag](c: Context)(typeName: c.Expr[String], map: c.Expr[JsObject]): c.Expr[T] = { import c.universe._ val cls = weakTypeOf[T].typeSymbol.asClass val tree = ??? //       c.Expr[T](tree) } def parseMessage[T](typeName: String, map: JsObject): T = macro Parsers.impl[T] }
      
      





parseMessage[T]



рдореИрдХреНрд░реЛ рдПрдХ рдкреНрд░рдХрд╛рд░ T



рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ parseMessage[T]



рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╣реИ, рдФрд░ рдбреАрдЬрд╝реЗрд░рд┐рд╕реЗрдмрд▓ map



рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рд╣реИ, рдФрд░ рдбреАрдЬрд╝реЗрд░рд┐рд▓реЗрд╕ рдЯреНрд░реА рдХреЛ рдмреЗрд╕ рдЯрд╛рдЗрдк T



рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рджреЗрддрд╛ рд╣реИ T







рдЯрд╛рдЗрдк T



рдПрдХ рддрд░реНрдХ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ T



рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдПрдХ c.WeakTypeTag



рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ c.WeakTypeTag



ред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд TypeTag



рддрд░реНрдХ TypeTag



рдЙрдкрдпреЛрдЧ рд╕реНрдХрд╛рд▓рд╛ рджреНрд╡рд╛рд░рд╛ рдЬреЗрдиреЗрд░рд┐рдХ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЯрд╛рдЗрдк рдПрд░рд╛рд╕реБрд░реЗрдЬ рдХреЗ рдХрд╛рд░рдг рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдХреНрд░реЛ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреЗрд╡рд▓ TypeTag



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди WeakTypeTag



, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ (рдЗрд╕рдореЗрдВ рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП "рдкреВрд░реНрдг" TypeTag



рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рджреМрд░рд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред TypeTag



рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ Universe



рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ typeOf[T]



рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рддрджрдиреБрд╕рд╛рд░, WeakTypeTag



рд▓рд┐рдП рдПрдХ weakTypeOf[T]



рд╡рд┐рдзрд┐ред



рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдХрдорд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреАрдврд╝реА рдХреЗ рджреМрд░рд╛рди рдХреЛрдб рдХрд╛ рдЯреБрдХрдбрд╝рд╛ 2 + 2



Apply(Select(Literal(Constant(2)), TermName("$plus")), List(Literal(Constant(2))))



рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП Apply(Select(Literal(Constant(2)), TermName("$plus")), List(Literal(Constant(2))))



; рдФрд░ рднреА рдЧрдВрднреАрд░ рдорд╛рдорд▓реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рд╣рдореЗрдВ рдкреИрдЯрд░реНрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕ рдХрдард┐рдирд╛рдИ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕реЗ рджреВрд░ рдХрд░реЗрдВрдЧреЗред



Kvazitsitaty



рд╕реНрдХреИрд▓рд╛ 2.11.0 рдХреЗ рдмрд╛рдж рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдЙрдкрд░реЛрдХреНрдд рдХрдореА рдХреЛ рдХреНрд╡реИрд╕реА-рдХреЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрд░реНрдз-рдЙрджреНрдзрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 2 + 2



рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрд░реНрдпреБрдХреНрдд рдирд┐рд░реНрдорд╛рдг рдмрд┐рд▓реНрдХреБрд▓ q"2 + 2"



рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдХреНрдпреВрд╕рд┐рдХреЛрдЯреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдкреЛрд▓рд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ Universe



рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдЗрди рдкреНрд░рдХреНрд╖реЗрдкрдХреЛрдВ рдХреЛ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рддреНрд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, cq



рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП pq



, match



рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП cq



, рдФрд░ рд╕рдВрдкреВрд░реНрдг рднрд╛рд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП q



рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИрдВред



рдЕрдиреНрдп рд╕реНрд▓рд╛рд▓рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдкреЛрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрд░реНрдз-рдЙрджреНрдзрд░рдг рдЙрдирдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рдЪрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 2 + 2



рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 + 2



рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



 val a = 2 q"$a + $a"
      
      





рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреНрд╖реЗрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрдиреНрди рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдЪрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдирд╛рдо рд╕реЗ рдПрдХ рдЪрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ TermName



рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреВрд░реЗ match



рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдПрдХ рдЖрдо рдкреЗрдбрд╝ рдХреА рдкреАрдврд╝реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд░реНрдз-рдЙрджреНрдзрд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд░ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:



 val clauses: Set[Tree] = ??? // .  val tree = q"$typeName match { case ..$clauses }"
      
      





рдХреЛрдб рдХрд╛ рдпрд╣ рдЦрдВрдб рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ case ..$clauses



match



рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ case ..$clauses



рдХреЛ case



рд╢рд╛рдЦрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:



 case "FieldMessage" => map.getFields("field") match { case Seq(field) => new FieldMessage(field.convertTo[String]) }
      
      





Quasicitals рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╢рд╛рдЦрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:



 val tpe: Type //   val constructorParameters: List[Symbol] //    val parameterNames = constructorParameters.map(_.name) val parameterNameStrings = parameterNames.map(_.toString) //         pq: val parameterBindings = parameterNames.map(name => pq"$name") //   ,     : val args = constructorParameters.map { param => val parameterName = TermName(param.name.toString) val parameterType = param.typeSignature q"$parameterName.convertTo[$parameterType]" } //     case: val typeName = tpe.typeSymbol val typeNameString = typeName.name.toString cq"""$typeNameString => $map.getFields(..$parameterNameStrings) match { case Seq(..$parameterBindings) => new $typeName(..$args) }"""
      
      





рдЗрд╕ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, рдХрдИ рдЕрд░реНрдз-рдЙрджреНрдзрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ pq"$name"



рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ Seq(...)



рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ JsValue



рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ JsValue



рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ quasi- convertTo



рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ convertTo



рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдореЗрдЯрд░ рдХреЛ рдкреБрди: рдХреЙрд▓ рдХрд░ рд╕рдХрддреА рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЖрдк рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдЯрд╛рдЗрдк Message



рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЕрдВрдд рдореЗрдВ, рдкрд░рд┐рдгрд╛рдореА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрддреНрдкрдиреНрди case



рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде match



рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



 val tree = q"$typeName match { case ..$clauses }"
      
      





рдпрд╣ рдкреЗрдбрд╝ рдореИрдХреНрд░реЛ рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдирд┐рд╖реНрдХрд░реНрд╖



рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрддреНрд╡ рдмрдирддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХреЛрдб рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╕реНрдХрд╛рд▓рд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдЬреЗрд╡реАрдПрдо рджреБрдирд┐рдпрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдпрд╛ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдмреЗрд╢рдХ, рдореИрдХреНрд░реЛрдЬрд╝ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрджрд┐ рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ рдкреИрд░ рдХреЛ рд╢реВрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрд╕рдорд░реНрдерд┐рдд рдХреЛрдб рдХреЗ рд░рд╕рд╛рддрд▓ рдореЗрдВ рдЧрд┐рд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд┐рдпрдорд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдФрд░ рдпрджрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдореБрджрд╛рдп рдХреЛ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдЧрд╛ред



рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛



  1. рд╕реНрдХрд╛рд▓рд╛ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдореИрдХреНрд░реЛ рдЕрд╡рд▓реЛрдХрди ред
  2. рд╕реНрдХрд╛рд▓рд╛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рд╕реЗ рдХреНрд╡реИрд╢реНрдЪрди рдХрд╛ рдЕрд╡рд▓реЛрдХрди ред
  3. рд╕реНрдХрд╛рд▓рд╛ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЕрд╡рд▓реЛрдХрди ред
  4. рдПрд╕рдмреАрдЯреА рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧрд╛рдЗрдб ред
  5. рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг ред



All Articles