рд╕реНрдХрд╛рд▓рд╛ред рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╢рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛!

рдФрд░ рдЕрдм рдЖрдкрдХреЛ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЙрдбрд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
- рдорд╣рд╛рди рдХреЗ рдЙрджреНрдзрд░рдг

рдФрд░ рдирдорд╕реНрддреЗ!

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

1. рд▓рд╛рдЧреВ рд░реВрдкрд╛рдВрддрд░рдг


рдФрд░ рд╣рдо рдирд┐рд╣рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдЦрдВрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдФрд░ рдПрдХ рдЬреАрд╡рди рдЙрджрд╛рд╣рд░рдг рд╣реИред
рд╡рд╕реАрд▓реА рдирд┐рд░реНрдорд╛рддрд╛ рд░реЗрдиреЙрд▓реНрдЯ рдХреА рдПрдХ рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреВрд░рд╛ рдкрд░рд┐рд╡рд╛рд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреИрд╕реЗ рдмрдЪрд╛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдкреВрд░реА рд░рд╛рд╢рд┐ рдЬрдорд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред рдПрдХ рдирдП WHA рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкрд░реНрдпрд╛рдкреНрдд рдзрдиред рдФрд░ рдлрд┐рд░ рдЕрдЪрд╛рдирдХ рддрд╛рд▓реА! рд░реЗрдиреЙрд▓реНрдЯ рдиреЗ AvtoVAZ рдЦрд░реАрджрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЕрдм рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рдкреИрд╕рд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рд╡рд╛рд╕рд┐рдпрд╛ рдЕрдм рдПрдХ рд╡рд┐рджреЗрд╢реА рдХрд╛рд░ рдХреЗ рдЦреБрд╢ рдорд╛рд▓рд┐рдХ рд╣реИрдВред
рдЕрдм рд╣рдо рдЗрд╕реЗ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

рдЬреАрд╡рди рдЙрджрд╛рд╣рд░рдг
case class Vasiliy(auto: Renault) { println("Vasiliy owns "+auto) } case class Renault(isRussian: Boolean = false) case class VAZ(isRussian: Boolean = true) object VAZ { implicit def vaz2renault(vaz: VAZ): Renault = Renault(vaz.isRussian) //   } object Family { def present = { Vasiliy(VAZ()) //  .   ! } } 

Family.present рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ Family.present рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ Vasiliy owns Renault(true) ред рдпрд╣ рдХреИрд╕реЗ рд╕реНрдХрд╛рд▓рд╛ рдЗрд╕ рдХрдард┐рди рдЬреАрд╡рди рдореЗрдВ рдЖрдо рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ!
рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ (рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ):

рдмреЗрдЬрд╛рди рдЙрджрд╛рд╣рд░рдг
 case class PermissionsList(permissions: Set[String] = Set("UL")); object PermissionsList { implicit def str2permissions(str: String) = PermissionsList(str.split(";").toSet) implicit def permissions2str(p: PermissionsList) = p.permissions.mkString(";") } // case class User(login: String, permissions: PermissionsList) /* somewhere in a galaxy far far away */ User(login = "Vasiliy", permissions = "UL;AL") //       

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЖрдкрдХреЛ рдПрдХ рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддрд╛рд░ рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдпрд╣ рдЙрд╕реА рд╡реЗрдм рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдлреЙрд░реНрдо "UL;AL" рдХреА рд╡рд╛рдВрдЫрд┐рдд рд▓рд╛рдЗрди рдХреЛ рдЧреЛрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рд╕рдордп рдкрд░ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдкрд░ рдЖрдП ред рдХрдм рдФрд░ рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╡реАрдПрдЬреЗрдб рдХрджреНрджреВ рд░реЗрдиреЙрд▓реНрдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ Permissionsрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рднреА рд╕реНрдХрд╛рд▓рд╛ рдЬрд╛рджреВ рд╕рдВрдХрд▓рди-рд╕рдордп (рднрд╛рд╖рд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдмреЗрд╣рдж рд╕реНрдорд╛рд░реНрдЯ рдФрд░ рд╕рдВрд╕рд╛рдзрди рд╡рд╛рд▓рд╛ рдкреНрд░рд╛рдгреА рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╣рдо VAZ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХреНрд╕рдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрднреА рднреА рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдиреА рдкреВрд░реА рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЗрдЯрд╛ рдХреЛ VAZ рдХреЗ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдХреБрдЫ рдкрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХреНрд╕реИрдЯ () рдХрд░ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, implicit def a2b(a: A): B
рд╡рд╣ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ:
рд╡реИрд╕реЗ, рдХреЗрд╡рд▓ рдПрдХ рдЧреИрд░-рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ / рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рд╡рд╕реАрд▓реА рдФрд░ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╣реИред

рез.рез рдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ


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

 object MySimpleHelper { implicit class StringExtended(str: String) { def sayIt = println(str) def sayItLouderBitch = println(str.toUpperCase +"!!!") } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджреНрдзреГрдд рдХрдЪреНрдЪреЗ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдПрдХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ - рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧред рдпрд╣ рд░реЗрдЦрд╛ рд╣рдореЗрдВ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдлрд╛рдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреА рдЧрдИ рд╣реИред рдФрд░ рдпрд╣ рдмрд╛рдд рдмрд╕ рддрдбрд╝рдкреА рд╣реИ:

 import MySimpleHelper._ "oh gosh" sayIt > oh gosh "oh gosh" sayItLouderBitch > OH GOSH!!! 

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ StringExtended рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 class StringExtended(str: String) { def sayIt = println(str) def sayItLouderBitch = println(str.toUpperCase +"!!!") } implicit def String2StringExtended(str: String): StringExtended = new StringExtended(str) 

рдкрд░рд┐рдЪрд┐рдд, рд╣реИ рдирд╛?

2. рд▓рд╛рдЧреВ рдорд╛рдкрджрдВрдбреЛрдВ


рдХрд┐рд╕реА рддрд░рд╣ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдм рдЧрдП рд╣реИрдВ? рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдЯреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИ! рдЖрдЗрдП рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ рд╣рд┐рд▓рд╛рдПрдВ рдФрд░ рдЪрдЯреНрдЯрд╛рди рдХреЗ рд╕реНрд░реЛрдд рдореЗрдВ рдЪрдврд╝реЗрдВ:

рд╕реВрд░реА рдХреЛрдб
 /** * TraversableOnce.scala: minBy * ,  ,      ,      ,    ,    B    A . ,   B    ,    A,  B  . - . */ def minBy[B](f: A => B)(implicit cmp: Ordering[B]): A = { //   -   ? if (isEmpty) throw new UnsupportedOperationException("empty.minBy") //     var minF: B = null.asInstanceOf[B] var minElem: A = null.asInstanceOf[A] var first = true //    //   for (elem <- self) { //    A,   B val fx = f(elem) if (first || cmp.lt(fx, minF)) { //     -     . //  cmp.lt  true   ,  f: B <   minF: B minElem = elem minF = fx first = false } } minElem } 

рдзрдХреНрдХрд╛ рджрд┐рдпрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдмрдВрдж рдХрд░реЛ, рджреВрд╕рд░рд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 val cities = Seq(new City(population = 100000), new City(500000)) val smallCity = cities.minBy( city => city.population ) 

рдФрд░ рд╣рдо рдХрд┐рд╕реА рднреА cmp: Ordering[B] ( B == Int) рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ cmp: Ordering[B] ( B == Int) ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рдЖрд░рд╛рдо рдХрд░реЛ, рдпрд╛рд░ред рдпрд╣ рдЬрд╛рджреВ рд╣реИред
рдЖрдпрд╛рддрд┐рдд рджрд╛рдпрд░реЗ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ scala.math.Ordering рдореМрдЬреВрдж рд╣реИ

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЛрдб
 object Ordering extends LowPriorityOrderingImplicits { ... trait IntOrdering extends Ordering[Int] { def compare(x: Int, y: Int) = if (x < y) -1 else if (x == y) 0 else 1 } implicit object Int extends IntOrdering ... } 

рдЖрдЗрдП рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдХрд┐ рдЕрдкрдиреЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рд╣реИ рдЬрдм рдЗрдВрдЯреНрд░реЛрдбрд░рд┐рдВрдЧ IntOrdering Ordering[Int] рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╕рдордп рд▓рд╛рдЧреВ рдХреА рдЧрдИ compare рд╡рд┐рдзрд┐ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд╢реБрдн minBy рд╕реЗ рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ minBy ред
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рджреЛрд╕реНрддрд╛рдирд╛ рдХреЛрдб
 implicit val myValue: Int = 5 object Jules { def doesHeLookLikeABitch(answer: String)(implicit times: Int) = { for(x <- 1 to times) println(answer ) } } Jules.doesHeLookLikeABitch("WHAT?") >WHAT? >WHAT? >WHAT? >WHAT? >WHAT? 

рдмреЗрд╢рдХ, рдХреЛрдИ рднреА рд╣рдореЗрдВ рд╣реИрдВрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдирд╣реАрдВ, рдареАрдХ рд╣реИ, рдЕрдЪрд╛рдирдХ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реЛрдЧреАред
рдФрд░ рдлрд┐рд░ рд╕реЗ, рдлрд┐рд░ рд╕реЗ, рд╕реАрдорд╛рдУрдВ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдмрд┐рдирд╛ред

3. рджреЗрдЦреЗрдВ / рдкреНрд░рд╕рдВрдЧ рд╕реАрдорд╛


рдпрджрд┐ рдЖрдкрдХрд╛ рдорд╕реНрддрд┐рд╖реНрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд┐рдШрд▓рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдмреНрд░реЗрдХ рд▓реЗрдВ рдФрд░ рдХреЙрдлреА рдкреАрдПрдВ, рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдордЬрдмреВрддред рдореИрдВ рдЖрдЬ рдХреЗ рд▓рд┐рдП рдирд╡реАрдирддрдо рдЧреИрд░-рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реА рд╡рд╛рд╕рд┐рд▓реА, рдЬреЛ рдПрдХ рдирдИ рдХрд╛рд░ (рдПрдХ exat() ) exat() , рдПрдХ рд╕рдлрд▓ рд╡реНрдпрдХреНрддрд┐ рдмрди рдЧрдИ рд╣реИ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ред рдФрд░ рдЕрдм рд╡реИрд╕рд┐рд▓реА рд╕реНрдХрд╛рд▓рд╛ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЕрд░рд╣рд░ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдорд╛рд░реНрдЯрд┐рди рдиреЗ рд╕реЛрдЪрд╛ рдФрд░ рдХрд╣рд╛ - рдареАрдХ рд╣реИред рдФрд░ рдЙрди рдкрд░ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рджрд┐рдПред рд╡рд╣реА рдбреА def f[T](a: T)

рей.рез рджреЗрдЦреЗрдВ рд╕реАрдорд╛

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд╣реАрдВ рдЖрд╕-рдкрд╛рд╕ рд╣реИред

 def f[A <% B](a: A) = a.bMethod 

рдпрд╛рдиреА рд╕реБрд▓рдн рджрд╛рдпрд░реЗ рдореЗрдВ A рд╕реЗ B рддрдХ A рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 def f[A](a: A) (implicit a2b: A => B) = a.bMethod: 

рдПрдХ рд░реВрд╕реА рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рдХрд░реАрдмреА рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 class Car { def exat() = println("POEXALI") } class VAZ object VAZ { implicit def vaz2car(v: VAZ): Car = new Car() } def go[A <% Car](a: A) = a.exat() go(new VAZ()) > POEXALI 

рдЕрджреНрднреБрдд! рдЬреАрд╡рди рд╕реБрдВрджрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдмрд╛рд▓ рд╡рд╛рдкрд╕ рд╣реЛ рдЧрдП рд╣реИрдВ, рдореЗрд░реА рдкрддреНрдиреА рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рд╣реИ, рддреЛ рд╕реВрдЪреА рдореЗрдВ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╡рд╕реАрд▓реА рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рдФрд░ рдорд╛рд░реНрдЯрд┐рди рдХреЛ рдЕрдм рдирд╣реАрдВ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ ... рдЗрд╕рд▓рд┐рдП рдпрд╣ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛

3.2 рдкреНрд░рд╕рдВрдЧ рд╕реАрдорд╛

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

 def f[A : B](a: A) = g(a) //  g    B[A] 

рдЗрд╕ рддрд░рд╣ рдХреА рдЬреЛрдбрд╝реА рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧреА:

 def f[A : Ordering](a: A, b: A) = if (implicitly[Ordering[A]].lt(a, b)) a else b vs def f[A](a: A, b: A)(implicit ord: Ordering[A]) = { import ord._ if (a < b) a else b } 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рдЙрдирдХреЗ рдЯрд╛рдЗрдкреЗрдХреЗрд▓ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд░ рдХрд╛ рдирдорд╕реНрддреЗ рд╣реИред

рдПрдХ рдЖрдлреНрдЯрд░рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп


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

Source: https://habr.com/ru/post/In209850/


All Articles