рд╕рднреА рдХреЛ рдирд╡рд╡рд░реНрд╖ 2020 рдХреА рд╣рд╛рд░реНрджрд┐рдХ рд╢реБрднрдХрд╛рдордирд╛рдПрдБред
рдкреНрд░рдердо рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рдж рд╕реЗ
рдЗрд╕ рд╡рд░реНрд╖ рдХреЗ рджреМрд░рд╛рди, рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖ, рдЗрд╕рдХреЗ рдХрдИ рдкрд╣рд▓реБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдореБрдЭреЗ рдпрд╣ рд╕рдм рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИред
Disclaimer
рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗрд╡рд▓ рдЙрддреНрд╕рд╛рд╣ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рд╢реНрд╡ рдкреНрд░рднреБрддреНрд╡ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ!
рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИред
рдирдпрд╛ рд╕рдВрдХрд▓рдХ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА /mashc рд╢рд╛рдЦрд╛ рдореЗрдВ, рдЖрдк рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдореИрд╢ (рднрд╛рд╖рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкрд╛рд╕ рдПрдПрд╕рдПрдо рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╣реИ (рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд▓рд┐рдП)ред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдЬрд╛рд╡рд╛ (рдЬреЗрдбреАрдХреЗ 1.8) рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рднрд╛рд╖рд╛ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдкреВрд░рдХ рдмрдирд╛рддрд╛ рд╣реИред
рдирдпрд╛ рдУрдУрдкреА
рднрд╛рд╖рд╛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдирдпрд╛ рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреНрд▓рд╛рд╕ рдмреЙрдбреА рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рд╣рд░ рджреЛрдиреЛрдВ рдЬрдЧрд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЕрдм рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ: init.
рдирдореВрдирд╛ рдХреЛрдб:
...
class MyClass:
private:
var a, b
public:
init(a, b):
$a ?= a
$b ?= b
end
func Foo():
return $a + $b
end
end
func MyClass::Bar(c):
return $a + $b + c
end
...
рдпрджрд┐ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдб рдХреЙрд▓ (рд╕реБрдкрд░) рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрддрд╛ рд╣реИред
рдирдореВрдирд╛ рдХреЛрдб:
...
class MySecondClass(MyClass):
public:
var c
init(a, b, c):
super(a, b)
$c ?= c
end
func Bar():
super($c)
end
end
...
x ?= new MySecondClass(10, 20, 30)
println( x -> Bar() ) // 60
рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЧрддрд┐рд╢реАрд▓ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
рдкреИрдХреЗрдЬ/рдирд╛рдорд╕реНрдерд╛рди
рдирд╛рдорд╕реНрдерд╛рди рд╕рд╛рдлрд╝ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП!
рддрджрдиреБрд╕рд╛рд░, рднрд╛рд╖рд╛ рдХреЛ рдпрд╣ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрд╢ рдореЗрдВ, рдпрджрд┐ рдХреЛрдИ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рднреА рднрд╛рдЧ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рд╕реБрдкрд░ рдСрдкрд░реЗрдЯрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЕрдкрд╡рд╛рдж
рднрд╛рд╖рд╛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
рдирдИ рдЧрдгрдирд╛
рдЕрдм рдЧрдгрдирд╛ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рд░рдВрддрд░ рдорд╛рди рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
рдЕрдиреНрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛
рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ, рдореИрд╢ рд▓реБрдЖ рдХреЗ рд╕рдорд╛рди рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рдкрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрд╢ рдореЗрдВ рдПрдХ рд░рдирдЯрд╛рдЗрдо рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╣реИ - рдПрдХ рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рд╡реАрдПрдо рдЬреЛ рдкреВрд░реНрдг рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИред
рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред
рднрд╛рд╖рд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред
рд╕рд╛рде рд╣реА, рднрд╛рд╖рд╛ рдФрд░ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд╣рдореЗрдВ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рднрд╛рд╖рд╛ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдЗрд╕рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╡рд┐рднрд┐рдиреНрди рдврд╛рдВрдЪреЛрдВ рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИред
рдореИрд╢ + рдЬреЗрд╡реАрдПрдо
рдореИрдВрдиреЗ JVM рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред
рд╢рд╛рдпрдж, рдПрди рд╕рдордп рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рд╣реИрдмреЗ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред
рдкрд░рд┐рдгрд╛рдо
рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реИрдВ. рдпрд╣ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ.
2020 рдореЗрдВ рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБред
рд╕реНрд░реЛрдд: www.habr.com