рд░реВрдмреА рдПрдХ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдПрдХ рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
module MyModule module InstanceMethods end module ClassMethods end def self.included(base) base.include(InstanceMethods) base.extend(ClassMethods) end end
рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдХреЗ рднреАрддрд░ рджреЛ рдЙрдк-рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬрдм MyModule рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдХреНрд▓рд╛рд╕ рдореЗрдВ "рдорд┐рдХреНрд╕рд┐рдВрдЧ" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдлрдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХреА, рдЬрд┐рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
class Ancestor def self.inherited(successor) end end class Successor < Ancestor end
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рд╕рдВрд╕реНрдХрд░рдг 3.0 рдореЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдмрд▓ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯреЗрд╕ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╕рдордп рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
require "active_support/core_ext/class/inheritable_attributes" class Base class_inheritable_accessor :color end Base.color = "red" class Ancestor < Base end Ancestor.color
рдХреНрдпрд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ? рдпрд╣ рд╣реИред рд╕рдЪ рд╣реИ, рд░реЗрд▓ рдХреЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЗрдирд╣реЗрд░рд┐рдЯреЗрдмрд▓_рдЯреИрдмреНрдпреВрдЬрд╝ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ class_attribute рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЬреИрд╕реЗ рд╣реА рдХреЙрд▓рдмреИрдХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╢реБрд░реВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреБрд░рдВрдд рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рд╡рд░реНрдЧ рдирд┐рдХрд╛рдп рдХреЗ рдирд┐рд╖реНрдХрд╛рд╕рди рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдмрд╛рдж рдореЗрдВред рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
class Base def self.inherited(m) puts "Hello from inherited callback" end end class NamedClass < Base puts "Hello from class body" end
рдпрд╛рдиреА рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреНрд▓рд╛рд╕ рдмреЙрдбреА рдИрд╡реИрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдПрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ "": рд░реВрдмреА рдореЗрдВ, рдирд╛рдорд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде, рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдПрдВ рднреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
anonymous_class = Class.new(Base) do
рдЬрдм рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдордгрд┐
рд╕рдХреНрд░рд┐рдп_рддреНрд░ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдЖрдпрд╛: рд░реВрдмреА рдореЗрдВ рджреМрдбрд╝рддреЗ рд╕рдордп рд░реВрдмреА 1.9 рдореЗрдВ рд╕рднреА
рд╕реНрдкреЗрдХреНрд╕ рдареАрдХ-рдард╛рдХ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреЗ рдкреБрд░рд╛рдиреЗ рд░реВрдмреА 1.8.7 (рдпрд╛ рд░реА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдзреЗ рдкрд░реАрдХреНрд╖рдг рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред (рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдИ рд░реЗрд▓ 3.0 рд╕рдорд░реНрдерди рдирд╣реАрдВ рдерд╛, рдФрд░ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рднреА рд╕реНрдкреЗрдХреНрд╕ рдиреЗ рдорд╛рдгрд┐рдХ рд╢рд╛рдЦрд╛ 1.9 рдФрд░ рд░реВрдмреА рд╢рд╛рдЦрд╛ 1.8 рджреЛрдиреЛрдВ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛)
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдирд┐рдореНрди рд░реВрдмреА 1.8.7 рдлреАрдЪрд░ рд╣реИ:
class Base def self.inherited(m) puts "--> Hello from inherited callback" end end puts "declare named class" class NamedClass < Base puts "--> Hello from named class" end puts puts "declare anonymous class" Class.new(Base) do puts "--> Hello from anonymous class" end
рд░реВрдмреА 1.8.7 рдореЗрдВ, рдПрдХ рдЕрдирд╛рдо рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рд╢рд░реАрд░ рдХреЛ рдкрд╣рд▓реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХреЙрд▓рдмреИрдХ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, InheritableAttributes рдореЙрдбреНрдпреВрд▓, рдЬреЛ рдПрдХ рдЦрд╛рд▓реА рд╡рд░реНрдЧ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
1. рд░реВрдмреА 1.9 рдкрд░ рдЬрд╛рдПрдВ
2. рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХреЙрд▓рдмреИрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ (рдпрджрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд░реЗрд▓ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╣реИ, рддреЛ рдпрд╣ рд░реЗрд▓ 3.1 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)
3. рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
4. рдкрд╣рд▓реЗ рдПрдХ рдЦрд╛рд▓реА рдЕрдирд╛рдо рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ, рдФрд░ рдлрд┐рд░ class_eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝реЗрдВ:
c = class.new(Base) c.class_eval do
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрдгрд┐рдд рдмрдЧ рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдФрд░ рд╣рд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рд░реВрдмреА 1.8.7 рдХреА рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЬрд╛рдирддреЗ рд╣реБрдП рдФрд░ рдЕрднреА рднреА рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдбрд┐рдмрдЧ рдкрд░ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред