рдореИрд╢ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреА рд╣реИ

рдореИрд╢ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреА рд╣реИ

рд╕рднреА рдХреЛ рдирд╡рд╡рд░реНрд╖ 2020 рдХреА рд╣рд╛рд░реНрджрд┐рдХ рд╢реБрднрдХрд╛рдордирд╛рдПрдБред

рдкреНрд░рдердо рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рдж рд╕реЗ рд░реЛрдЬрд╝рд╛ рдореИрд╢ рдХреЛ рд▓рдЧрднрдЧ рдареАрдХ 1 рд╡рд░реНрд╖ рдмреАрдд рдЪреБрдХрд╛ рд╣реИред

рдЗрд╕ рд╡рд░реНрд╖ рдХреЗ рджреМрд░рд╛рди, рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖ, рдЗрд╕рдХреЗ рдХрдИ рдкрд╣рд▓реБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдореБрдЭреЗ рдпрд╣ рд╕рдм рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИред

Disclaimer

рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗрд╡рд▓ рдЙрддреНрд╕рд╛рд╣ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рд╢реНрд╡ рдкреНрд░рднреБрддреНрд╡ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ!

рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИред

GitHub
╨б╨░╨╣╤В
рдордВрдЪ

рдирдпрд╛ рд╕рдВрдХрд▓рдХ

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА /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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ