рд░реВрдмреА рдореЗрдВ рдЦреБрд▓реА рдХрдХреНрд╖рд╛рдПрдВ, рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдиреЛрдЯреНрд╕

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


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

рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдВрдЧ рдореЗрдВ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕рд╣рд┐рдд:

trait Existable { fn exist(&self) -> bool; } impl Existable for int { fn exist(&self) -> bool { if *self == 0 { false } else { true } } } fn main () { assert!(5.exist() == true) assert!(0.exist() == false) } 


рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рдпреЛрдЬрдирд╛ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдЬрдЧрд░ рдореЗрдВ, рдЖрдк рддреГрддреАрдп-рдкрдХреНрд╖ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдП рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class Trait(object): def __init__(self): self.registry = {} def impl(self, typ): def reg(func): self.registry[typ] = func return func return reg def __call__(self, arg): return self.registry[arg.__class__](arg) Existable = Trait() @Existable.impl(int) def int_exists(i): return False if i == 0 else True if __name__ == '__main__': assert Existable(0) == False assert Existable(5) == True 

рдЦреИрд░, рдпрд╛ рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдПрдХ рдорд┐рдирдЯ рд╕реНрдХреЗрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмреБрджреНрдзрд┐рдорд╛рди рд╣реИред

рдорд╛рдгрд┐рдХ рдиреЗ рдРрд╕реА рдмрд╛рдд рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛?

 class Object # File activesupport/lib/active_support/core_ext/object/blank.rb, line 13 def blank? respond_to?(:empty?) ? empty? : !self end end 


`рдЦрд╛рд▓реА?` рд╡рд┐рдзрд┐ `рдПрд░реЗ` рдФрд░` рд╣рд╛рд╢` рд╡рд░реНрдЧреЛрдВ (рдХрдо рд╕реЗ рдХрдо) рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдФрд░ `рд░рд┐рдХреНрдд 'рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ? рд╡рд┐рдзрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧреАред рдпрд╣реА рд╣реИ, рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдгрд┐рдХ рдореЗрдВ рдРрд╕реА рд╡рд╕реНрддреБрдПрдБ рд╣реИрдВ - рдРрд╕реА рд╡рд╕реНрддреБрдПрдБ рдЬреЛ 'рдЦрд╛рд▓реА' рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреА рд╣реИрдВ? `рд╢реВрдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд╛рдБрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ, рд╡рд╣реА` рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд`ред

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

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

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

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

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


All Articles