рдФрд░ рдЕрдм рдЖрдкрдХреЛ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЙрдбрд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред- рдорд╣рд╛рди рдХреЗ рдЙрджреНрдзрд░рдгрдФрд░ рдирдорд╕реНрддреЗ!
рдЖрдЬ рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдХреИрд▓рд╛ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрднреА рддрдХ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рдирд┐рд╣рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди, рдорд╛рдкрджрдВрдбреЛрдВ, рд╡рд░реНрдЧреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЬреИрд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рд╕рднреА рдирд╡рд╛рдЧрдВрддреБрдХ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╝реЗрдиреЛрд╡ рдПрдХреНрд╕рдкреНрд▓рдХреНрдЯ рдХреЗ рд╕рд╛рде рдЕрдЬрдЧрд░ рдкреНрд░реЗрдореА рдЗрдВрдкреНрд▓рд╛рдВрдЯ
рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВ , рдЖрдорддреМрд░ рдкрд░ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдЗрдВрдЬрди рд╣реБрдб рдЬрд╛рджреВ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреВрд░реЗ рд╕рдВрдХрд▓рдХ рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдХрд╡рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕рдбрд╝рдХ рдкреНрд░рдмрд▓ рд╣реЛрдЧреА?
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)
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(";") }
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЖрдкрдХреЛ рдПрдХ рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддрд╛рд░ рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдпрд╣ рдЙрд╕реА рд╡реЗрдм рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдлреЙрд░реНрдо
"UL;AL"
рдХреА рд╡рд╛рдВрдЫрд┐рдд рд▓рд╛рдЗрди рдХреЛ рдЧреЛрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рд╕рдордп рдкрд░ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдкрд░ рдЖрдП ред рдХрдм рдФрд░ рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╡реАрдПрдЬреЗрдб
рдХрджреНрджреВ рд░реЗрдиреЙрд▓реНрдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ Permissionsрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?
рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рднреА рд╕реНрдХрд╛рд▓рд╛ рдЬрд╛рджреВ рд╕рдВрдХрд▓рди-рд╕рдордп (рднрд╛рд╖рд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдмреЗрд╣рдж рд╕реНрдорд╛рд░реНрдЯ рдФрд░ рд╕рдВрд╕рд╛рдзрди рд╡рд╛рд▓рд╛ рдкреНрд░рд╛рдгреА рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╣рдо VAZ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХреНрд╕рдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрднреА рднреА рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдиреА рдкреВрд░реА рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЗрдЯрд╛ рдХреЛ VAZ рдХреЗ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдХреБрдЫ рдкрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХреНрд╕реИрдЯ () рдХрд░ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ,
implicit def a2b(a: A): B
рд╡рд╣ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ:
- рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрджрд░)
- рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ (
import app.VAZ.vaz2renault
) - рдпрд╛ рд╕рдореВрд╣ рдЖрдпрд╛рдд (
import app.VAZ._
) - рдПрдХ рд╕рд╛рдереА рд╡рд╕реНрддреБ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп
рд╡реИрд╕реЗ, рдХреЗрд╡рд▓ рдПрдХ рдЧреИрд░-рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ / рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рд╡рд╕реАрд▓реА рдФрд░ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╣реИред
рез.рез рдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ
рд╕рдВрд╕реНрдХрд░рдг 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!!!
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдирд┐рд╣рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, "рдлреИрд▓рддрд╛ рд╣реИ" (рд╣рдо рдереЛрдбрд╝реЗ рд╕рдордп рдмрд╛рдж рдирд┐рд╣рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ)
- рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ, рд▓рдХреНрд╖рдгреЛрдВ, рдЕрдиреНрдп рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рд╣реА рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
- рдПрдХ рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ, рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рддрд░реАрдХреЗ, рдЧреБрдг, рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ
VAZ
рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ, рддреЛ implicit class VAZ
рдкрд╛рд╕ рдореЗрдВ рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ
StringExtended
рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
class StringExtended(str: String) { def sayIt = println(str) def sayItLouderBitch = println(str.toUpperCase +"!!!") } implicit def String2StringExtended(str: String): StringExtended = new StringExtended(str)
рдкрд░рд┐рдЪрд┐рдд, рд╣реИ рдирд╛?
2. рд▓рд╛рдЧреВ рдорд╛рдкрджрдВрдбреЛрдВ
рдХрд┐рд╕реА рддрд░рд╣ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдм рдЧрдП рд╣реИрдВ? рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдЯреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИ! рдЖрдЗрдП рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ рд╣рд┐рд▓рд╛рдПрдВ рдФрд░ рдЪрдЯреНрдЯрд╛рди рдХреЗ рд╕реНрд░реЛрдд рдореЗрдВ рдЪрдврд╝реЗрдВ:
рд╕реВрд░реА рдХреЛрдб def minBy[B](f: A => B)(implicit cmp: Ordering[B]): A = {
рдзрдХреНрдХрд╛ рджрд┐рдпрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдмрдВрдж рдХрд░реЛ, рджреВрд╕рд░рд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
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?
рдмреЗрд╢рдХ, рдХреЛрдИ рднреА рд╣рдореЗрдВ рд╣реИрдВрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдирд╣реАрдВ, рдареАрдХ рд╣реИ, рдЕрдЪрд╛рдирдХ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реЛрдЧреАред
рдФрд░ рдлрд┐рд░ рд╕реЗ, рдлрд┐рд░ рд╕реЗ, рд╕реАрдорд╛рдУрдВ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдмрд┐рдирд╛ред
- рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдПрдХ рд╡рд╕реНрддреБ / рдореВрд▓реНрдп рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╕рдВрдХрд▓рдХ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпрд╛ рд╣реИред
- рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ
implicit T
рдХреЗ рд╕рд╛рдереА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд░рд╣реЗрдЧрд╛, рдпрджрд┐ рдХреЛрдИ рдореМрдЬреВрдж рд╣реИ, рдФрд░ implicit val x: T
рдЦреАрдВрдЪрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рдореЗрд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдХрдард┐рди рджрд╡рд╛рдПрдВ рд╣реИрдВред
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)
рдЗрд╕ рддрд░рд╣ рдХреА рдЬреЛрдбрд╝реА рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧреА:
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 }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рдЙрдирдХреЗ рдЯрд╛рдЗрдкреЗрдХреЗрд▓ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд░ рдХрд╛ рдирдорд╕реНрддреЗ рд╣реИред
рдПрдХ рдЖрдлреНрдЯрд░рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп
рд╕рдбрд╝рдХ рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рднреА рдПрдХ рдмрд╛рд░ рдореЗрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЦреНрдп рдмрд╛рдд рд╕рдордЭ рдФрд░ рд╕рдордЭрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИред рдЗрдЪреНрдЫрд╛ рд╕реЗ рдЬрд╛рдЧрд░реВрдХрддрд╛ рдЖрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХреБрдЫ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХреЛрдб рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдиреЛрдЯрдмреБрдХ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЖрдИрдбреАрдИ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдореЗрд░рд╛ рд╕рд┐рд░ рдирд╣реАрдВ рдлреЛрдбрд╝рд╛, рдореИрдВ рдЬрд╛рдКрдВрдЧрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред