рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддреБрд░рдВрдд рд╢рд░реНрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред
- рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди - рдбреЗрдЯрд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдПрдХ рд╣реА рдШрдЯрдХ рдореЗрдВ рдкреИрдХ рдХрд░рдирд╛ред
- Concealment - рдПрдХ рдбрд┐рдЬрд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдШрдЯрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╡рд┐рдХреА рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЗ рд╕рд╛рде рд░реВрдмреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдЫрд┐рдкрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде, рд╕реНрдерд╛рдиреАрдп рдЪрд░, рдЙрджрд╛рд╣рд░рдг рдЪрд░, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░ ( public
, protected
, private
) рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
class User class Address < String def ==(other_object)
рд╣рдо User
рдЕрдВрджрд░ Address
рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рд╛рд░ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкрддрд╛ рдЬреЛ рдХреЗрд╡рд▓ User
рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдпрд╣ Address
рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рд╕реБрд▓рдн рд╣реЛ, рдЕрд░реНрдерд╛рдд рди рдХреЗрд╡рд▓ User
рдЕрдВрджрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рдЕрдиреНрдп рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЫрд┐рдкрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ?
рдЖрдк рдЗрд╕реЗ private
рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред
class User private class Address < String def ==(other_object)
pry
рдЕрдВрджрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП pry
рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
User::Address => User::Address User::Address.new => ""
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ private
рд╕рдВрд╢реЛрдзрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ рдЬрд╛рджреВ private_constant
рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдХрд┐ рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧреАред рдЖрдЦрд┐рд░рдХрд╛рд░, рдорд╛рдгрд┐рдХ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВред рдЕрдм рд╣рдо private_constant :Address
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ private_constant :Address
User::Address
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп private_constant :Address
рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ private_constant :Address
User::Address
:
NameError: private constant User::Address referenced
рдЕрдм рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдФрд░ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдПрдХ рдХреИрд╢рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд░реЗрдбрд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдкрд░реЗрд╢рд╛рдиреА рдирд╣реАрдВ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╡реНрдпреВ рдХреЗ рдмреАрдЪ рдореЗрдВ, redis.get
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ redis.set
redis.get
\ redis.set
рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ SharedCache рдХреЛ рднреА рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЗрд▓рд╛рдЬ рдХрд░рддреЗ рд╣реИрдВ:
require 'redis' SharedCache.send :const_set, :Redis, Redis Object.send :remove_const, :Redis Redis NameError: uninitialized constant Redis from (pry):7:in `__pry__'
рдХреНрдпрд╛ рд╣реБрдЖ? remove_const
рдХреЛ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ remove_const
рд╣рдо Redis рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреЙрдк-рд▓реЗрд╡рд▓ рджреГрд╢реНрдпрддрд╛ рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрдирд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ SharedCache
рдХреЛ SharedCache
рдЕрдВрджрд░ рдбрд╛рд▓ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо SharedCache::Redis
рдорд╛рдзреНрдпрдо рд╕реЗ SharedCache::Redis
рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрдм рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ Redis
рд╡рд░реНрдЧ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдкрд╛рдПрдВрдЧреЗ, рднрд▓реЗ рд╣реА рд╣рдо рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реЛрдВред рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрдВрджрд░ require
рд╣реИ:
class SharedCache require_to 'redis', :Redis private_constant :Redis def storage Redis end end class SharedCache2 require_to 'redis', :Redis private_constant :Redis end
рд░реЗрдбрд┐рд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕:
[1] pry(main)> SharedCache::Redis NameError: private constant SharedCache::Redis referenced from (pry):1:in `<main>' [2] pry(main)> require 'redis' => false [3] pry(main)> Redis NameError: uninitialized constant Redis from (pry):6:in `<main>' [4] pry(main)> SharedCache.new.storage => Redis [5] pry(main)> SharedCache2::Redis NameError: private constant SharedCache2::Redis referenced from (pry):1:in `<main>'
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЧ рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
- рд╕рд░реНрд╡рд┐рд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдЕрдВрджрд░ рддрд░реНрдХ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди - рдЖрдк рд╕рд░реНрд╡рд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдХреНрд▓рд╛рд╕реЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред
- рд╢реАрд░реНрд╖-рд╕реНрддрд░ рдХреА рджреГрд╢реНрдпрддрд╛ рд╕реЗ "рдЦрддрд░рдирд╛рдХ" рдХрдХреНрд╖рд╛рдПрдВ рдирд┐рдХрд╛рд▓реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реНрдпреВ рдпрд╛ рд╕реАрд░рд┐рдпрд▓ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд░реЗрд▓ рдореЗрдВ, рдЖрдк рд╕рднреА ActiveRecord рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ "рдЫрд┐рдкрд╛" рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рдиреЛрдВ рддрдХ рдЪрдпрдирд╛рддреНрдордХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ require_to
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрддрд░ рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
require_to class Object def const_hide sym, obj _hidden_consts.const_set sym, obj Object.send :remove_const, sym end def hidden_constants _hidden_consts.constants end def hidden_const sym _hidden_consts.const_get sym end def require_to(name, sym, to: nil) require name if Object.const_defined? sym obj = Object.const_get sym const_hide sym, obj else obj = hidden_const sym end (to || self).const_set sym, obj end private def _hidden_consts @@_hidden_consts ||= Class.new end end