рд░реВрдмреА 2.1 рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ (рднрд╛рдЧ 1)



рд░реВрдмреА 2.1, рд░реВрдмреА (рд▓реЗрдЦрди рдХреЗ рд╕рдордп) рдХрд╛ рдирд╡реАрдирддрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг, рдХреНрд░рд┐рд╕рдорд╕ 2013 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, 2.0.0 рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдареАрдХ 10 рдорд╣реАрдиреЗ рдмрд╛рджред рд╡рд╣ рдХрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдЖрдИ, рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрди рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдирдИ рд╕рдВрд╕реНрдХрд░рдг рдиреАрддрд┐


рд╕рдВрд╕реНрдХрд░рдг 2.1 рдХреЗ рд╕рд╛рде, рд░реВрдмреА рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдИ рд╕рдВрд╕реНрдХрд░рдг рдпреЛрдЬрдирд╛ рдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИред



рд╕рдВрд╕реНрдХрд░рдг MAJOR.MINOR.TEENY рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╕рдВрд╕реНрдХрд░рдг 2.1.0 рдореЗрдВ: 2 - рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг, 1 - рдорд╛рдореВрд▓реА, рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг - 0. рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдорд╛рдореВрд▓реА рдмрдЧ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рд╕реЗ рд▓реА рдЧрдИ рд╣реИред рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рдХреЗ рд▓рд┐рдП, рдФрд░ рдкреНрд░рдореБрдЦ рдПрдХ - рдЕрд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рддрд╣рдд рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1.9.3 рдФрд░ 1.9.3-p545 рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдлреЙрд░реНрдо 2.1 рдФрд░ 2.1.1 рдХреА рд░рд┐рд▓реАрдЬ рдорд┐рд▓рддреА рд╣реИред



рдпрд╣ рд╣рд░ 12 рдорд╣реАрдиреЗ рдореЗрдВ рдЫреЛрдЯреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╣рдо рдХреНрд░рд┐рд╕рдорд╕ 2014 рддрдХ рд░реВрдмреА 2.2 рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЖрд╡рд╢реНрдпрдХ рдирд╛рдорд╛рдВрдХрд┐рдд рддрд░реНрдХ


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



# length is required def pad(num, length:, char: "0") num.to_s.rjust(length, char) end pad(42, length: 6) #=> "000042" pad(42) #=> #<ArgumentError: missing keyword: length>
      
      





рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдорд┐рдд рддрд░реНрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдЖрдкрдХреЛ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



рд╕реНрдЯреНрд░рд┐рдВрдЧ # рдлреНрд░реАрдЬ рд╡рд┐рдзрд┐ рдЕрдиреБрдХреВрд▓рди


рдХреНрдпреЛрдВрдХрд┐ рд░реВрдмреА рдореЗрдВ рддрд╛рд░ рдкрд░рд╕реНрдкрд░ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╣реИ:



 def env "development" end # returns new String object on each call env.object_id #=> 70329318373020 env.object_id #=> 70329318372900
      
      





рдпрд╣ рдмрд╣реБрдд рдмреЗрдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдкрд╣рд▓реЗ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рдЯрд╛ рджреЗрдВред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реАрдзреЗ #freeze рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрдВрдХреНрддрд┐ рдЦреЛрдЬ "рдЬрдореЗ рд╣реБрдП" рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдЧреА, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЙрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:



 def env "development".freeze end # returns the same String object on each call env.object_id #=> 70365553080120 env.object_id #=> 70365553080120
      
      





рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рдЬреЛ рдХрд┐ рд╣реИрд╢ рдХреАрдЬрд╝ рд╣реИрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдмрд┐рдирд╛ #freeze рдХреЗ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ред



 a = {"name" => "Arthur"} b = {"name" => "Ford"} # same String object used as key in both hashes a.keys.first.object_id #=> 70253124073040 b.keys.first.object_id #=> 70253124073040
      
      





рд╡рд┐рдХрд╛рд╕ 2.1 рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдПрдХ рдмрджрд▓рд╛рд╡ рдерд╛, рдЬрд╣рд╛рдВ "рд╕реНрдЯреНрд░рд┐рдВрдЧ" рдПрдл "рдлреНрд░реЛрдЬрди" рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ # рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛, рдЬреЛ рдкреНрд░рддреНрдпрдХреНрд╖ рдФрд░ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХрдИ рд▓реЛрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред



def рдПрдХ рдкреНрд░рддреАрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ


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



 class Client def initialize(host, port) # ... end private def do_request(method, path, body, **headers) # ... end def get(path, **headers) do_request(:get, path, nil, **headers) end end
      
      





рдЗрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЙрд▓рдмреИрдХ рдХреЗ рдкрд╣рд▓реЗ / рдмрд╛рдж рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ # рдкреНрд░реАрдкреЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:



 module Around def around(method) prepend(Module.new do define_method(method) do |*args, &block| send(:"before_#{method}") if respond_to?(:"before_#{method}", true) result = super(*args, &block) send(:"after_#{method}") if respond_to?(:"after_#{method}", true) result end end) method end end class Example extend Around around def call puts "call" end def before_call puts "before" end def after_call puts "after" end end Example.new.call
      
      





рд▓рд╛рдПрдЧрд╛



 before call after
      
      





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



рддрд░реНрдХрд╕рдВрдЧрдд рдФрд░ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╣рд┐рддреНрдп


рд░реВрдмреА рдХреЗ рдкрд╛рд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╢рд╛рдмреНрджрд┐рдХ рд╣реИрдВ рдЗрдВрдЯреЗрдЧрд░ (1) рдФрд░ рдлреНрд▓реЛрдЯ (1.0), рдЕрдм рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╢рд╛рдмреНрджрд┐рдХ, рддрд░реНрдХрд╕рдВрдЧрдд (1r) рдФрд░ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ (1i) рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред



рд╡реЗ рд░реВрдмреА рдореЗрдВ рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯ рдореИрдХреЗрдирд┐рдЬреНрдо рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП 1/3 рдХреЛ рд░реВрдмреА рдореЗрдВ 1 / 3r рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 3i рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ 0 + 3i рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдорд╛рдирдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдорд╛рдирдХ рдЧрдгрд┐рддреАрдп рдЕрдВрдХрди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд░реВрдмреА рдореЗрдВ 2 + 3i рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ 2 + 3i рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ!



рдПрд░реЗ / рдПрдиреНрдпреБрдорд░реЗрдмрд▓ #to_h


рд░реВрдмреА 2.0.0 рдореЗрдВ #to_h рдкрджреНрдзрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рд╡рд░реНрдЧ рдЕрдм рдРрд░реЗ рд╡рд░реНрдЧ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕рдореГрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ Enumerable рд╢рд╛рдорд┐рд▓ рд╣реИред



 [[:id, 42], [:name, "Arthur"]].to_h #=> {:id=>42, :name=>"Arthur"} require "set" Set[[:id, 42], [:name, "Arthur"]].to_h #=> {:id=>42, :name=>"Arthur"}
      
      





рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣реИрд╢ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдПрдХ рдРрд░реЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ:



 headers = {"Content-Length" => 42, "Content-Type" => "text/html"} headers.map {|k, v| [k.downcase, v]}.to_h #=> {"content-length" => 42, "content-type" => "text/html"}
      
      







рд╕рд╛рдЭрд╛ рдкрджреНрдзрддрд┐ рдХреИрд╢рд┐рдВрдЧ


рд╕рдВрд╕реНрдХрд░рдг 2.1 рд╕реЗ рдкрд╣рд▓реЗ, рд░реВрдмреА рдиреЗ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдзрд┐ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕рд╣рд┐рдд, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рдЗрд╕рдиреЗ рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ (рдЬреИрд╕реЗ рдУрдкреЗрдирд╕реНрдЯреНрд░рдХреНрдЯ) рдФрд░ рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ (рдЬреИрд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЯреИрдЧ рдХрд░рдирд╛ ) рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рдмреЗрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ред



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



RubyVM рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИ рдЬреЛ рд╡рд┐рдзрд┐ рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рд▓реМрдЯрд╛рддреА рд╣реИ:



 class Foo end RubyVM.stat #=> {:global_method_state=>133, :global_constant_state=>820, :class_serial=>5689} # setting constant increments :global_constant_state Foo::Bar = "bar" RubyVM.stat(:global_constant_state) #=> 821 # defining instance method increments :class_serial class Foo def foo end end RubyVM.stat(:class_serial) #=> 5690 # defining global method increments :global_method_state def foo end RubyVM.stat(:global_method_state) #=> 134
      
      







рдЕрдкрд╡рд╛рдж


рдЕрдкрд╡рд╛рдж рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдм рдПрдХ #cause рдкрджреНрдзрддрд┐ рд╣реИ рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдлреЗрдВрдХрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред



 require "socket" module MyProject Error = Class.new(StandardError) NotFoundError = Class.new(Error) ConnectionError = Class.new(Error) def self.get(path) response = do_get(path) raise NotFoundError, "#{path} not found" if response.code == "404" response.body rescue Errno::ECONNREFUSED, SocketError => e raise ConnectionError end end begin MyProject.get("/example") rescue MyProject::Error => e e #=> #<MyProject::ConnectionError: MyProject::ConnectionError> e.cause #=> #<Errno::ECONNREFUSED: Connection refused - connect(2) for "example.com" port 80> end
      
      





рдлрд┐рд▓рд╣рд╛рд▓, рдкрд╣рд▓рд╛ рдЕрдкрд╡рд╛рдж рдХрд╣реАрдВ рднреА рдлреЗрдВрдХрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрдЪрд╛рд╡ рдШрдЯрдирд╛ рдХреЗ рдХрд╛рд░рдг рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди #cause рдкрджреНрдзрддрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдХрд╛рдлреА рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИред



рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ #backtrace_locations рд╡рд┐рдзрд┐ рднреА рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ 2.0.0 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ ред рдпрд╣ рдереНрд░реЗрдб :: рдмреИрдХрдЯреНрд░реЗрд╕ :: рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд╛рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╡рд┐рд╡рд░рдгреЛрдВ рддрдХ рдЖрд╕рд╛рди рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред



рдкреАрдврд╝реАрдЧрдд рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛


рд░реВрдмреА 2.1 рдПрдХ рдкреАрдврд╝реА-рдЖрдзрд╛рд░рд┐рдд рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдпреБрд╡рд╛ рдФрд░ рдкреБрд░рд╛рдиреА рдкреАрдврд╝рд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди, рдЬреАрд╕реА рдХреЗрд╡рд▓ рдпреБрд╡рд╛ рдкреАрдврд╝реА рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреЗрдЦреЗрдЧрд╛, рдЬрдмрдХрд┐ рдкреБрд░рд╛рдиреА рдкреАрдврд╝реА рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрд╣реБрдд рдХрдо рдмрд╛рд░ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ (рд╕реНрд╡реАрдк рдХрд░рдирд╛) 1.9.3 (рдЖрд▓рд╕реА рд╕реНрд╡реАрдк) рдХреЗ рд╕рдорд╛рди рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпреБрд╡рд╛ рдкреАрдврд╝реА рдЬреАрд╕реА рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ "рдЬреАрд╡рд┐рдд" рд╣реЛрддреА рд╣реИ, рддреЛ рд╡рд╣ рдкреБрд░рд╛рдиреА рдкреАрдврд╝реА рдореЗрдВ рдЪрд▓реА рдЬрд╛рддреА рд╣реИред



рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреБрд░рд╛рдиреА рдкреАрдврд╝реА рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рдпреБрд╡рд╛ рдкреАрдврд╝реА рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ рдпреБрд╡рд╛ рдкреАрдврд╝реА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЬреАрд╕реА рдЧрд▓рддреА рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд╡рд░реЛрдзреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдкреБрд░рд╛рдиреА рдкреАрдврд╝реА рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдпрд╛рдж рд╕реЗрдЯ рдкрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдпреБрд╡рд╛ рдкреАрдврд╝реА рдХреА рд╡рд╕реНрддреБрдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, old_array.push (young_string)) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпреБрд╡рд╛ рдкреАрдврд╝реА рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╕реЗрдЯ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреАрдврд╝реАрдЧрдд рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕реА рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рддреГрддреАрдп-рдкрдХреНрд╖ рд░реВрдмреА рд╕реА-рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рдереА (рддрдерд╛рдХрдерд┐рдд "рдЫрд╛рдпрд╛" рд╡рд╕реНрддреБрдПрдВ) рдХрднреА рднреА рдкреБрд░рд╛рдиреА рдкреАрдврд╝реА рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдПрдХ рдкреАрдврд╝реАрдЧрдд рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреА рд╕рднреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХрддрдо рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред



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



рдХрдХреНрд╖рд╛ рдЬреА.рд╕реА.


GC.start рдкрджреНрдзрддрд┐ рджреЛ рдирдП рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИ, full_mark рдФрд░ рддрддреНрдХрд╛рд▓_sweepред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рд╕рддреНрдп рд╣реИрдВред

рдпрджрд┐ full_mark рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдВрдХрди рдЪрд░рдг рджреЛрдиреЛрдВ рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЧрд▓рдд рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдпреБрд╡рд╛ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рддрддреНрдХрд╛рд▓_рд╕реНрд╡реЗрдк рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд░реЛрдХреЗрдВ рджреБрдирд┐рдпрд╛ рддреБрд░рдВрдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдЧреА; рдпрджрд┐ рдЧрд▓рдд рд╣реИ, рддреЛ рдЖрд▓рд╕реА рд╕реНрд╡реАрдк рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред



 GC.start # trigger a full GC run GC.start(full_mark: false) # only collect young generation GC.start(immediate_sweep: false) # mark only GC.start(full_mark: false, immediate_sweep: false) # minor GC
      
      





рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк GC.stress рдХреЛ рдЕрдм рдкреВрд░реНрдгрд╛рдВрдХ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдХрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



 GC.stress = true # full GC at every opportunity GC.stress = 1 # minor marking at every opportunity GC.stress = 2 # lazy sweep at every opportunity
      
      





GC.stat рдЕрдм рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдорд╛рдиреЛрдВ рдХреЗ рдкреВрд░реЗ рд╣реИрд╢ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред



 GC.stat #=> {:count=>6, ... } GC.stat(:major_gc_count) #=> 2 GC.stat(:minor_gc_count) #=> 4
      
      





рдирд╡реАрдирддрдо_gc_info рдкрджреНрдзрддрд┐ рднреА рд╕рд╛рдордиреЗ рдЖрдИ рд╣реИ, рдЬреЛ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХрдЪрд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддреА рд╣реИред



 GC.latest_gc_info #=> {:major_by=>:oldgen, :gc_by=>:newobj, :have_finalizer=>false, :immediate_sweep=>false}
      
      







рдЬреАрд╕реА - рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛


рдХрдИ рдирдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд░реВрдмреА рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред



RUBY_GC_HEAP_INIT_SLOTS
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрд╣рд▓реЗ RUBY_HEAP_MIN_SLOTS рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдерд╛ред рдпрд╣ рд╕реНрд▓реЙрдЯреНрд╕ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 10000 рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред



RUBY_GC_HEAP_FREE_SLOTS
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкреВрд░реНрд╡ рдореЗрдВ RUBY_FREE_MIN рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рдерд╛ред рдпрд╣ рд╕реНрд▓реЙрдЯ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЬреАрд╕реА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЬреАрд╕реА рдиреЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрд▓реЙрдЯ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ, рддреЛ рдирдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, 4096ред



RUBY_GC_HEAP_GROWTH_FACTOR
рдЧреБрдгрд╛рдВрдХ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрд▓реЙрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред (рдЕрдЧрд▓реЗ рд╕реНрд▓реЙрдЯ рд╕рдВрдЦреНрдпрд╛) = (рд╡рд░реНрддрдорд╛рди рд╕реНрд▓реЙрдЯ рд╕рдВрдЦреНрдпрд╛) * (рдпрд╣ рдХрд╛рд░рдХ)ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 1.8 рд╣реИред



RUBY_GC_HEAP_GROWTH_MAX_SLOTS
рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрд▓реЙрдЯред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 0 рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрдо рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред



RUBY_GC_MALLOC_LIMIT
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрд╣ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 16 * 1024 * 1024 (16 рдПрдордмреА) рд╣реИред



RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR
рд╡реГрджреНрдзрд┐ рдХрд╛рд░рдХ malloc_limit рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ 1.4 рд╣реИред



RUBY_GC_MALLOC_LIMIT_MAX
рд╡рд╣ рдЕрдзрд┐рдХрддрдо рдЬреЛ Malloc_limit рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 32 * 1024 * 1024 (32 рдПрдордмреА) рд╣реИред



RUBY_GC_OLDMALLOC_LIMIT
рдПрдХ рдкреВрд░реА рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреБрд░рд╛рдиреА рдкреАрдврд╝реА рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 16 * 1024 * 1024 (16 рдПрдордмреА) рд╣реИред



RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR
рд╡реГрджреНрдзрд┐ рдХрд╛ рдЧреБрдгрд╛рдВрдХ old_malloc_limit рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 1.2 рд╣реИред



RUBY_GC_OLDMALLOC_LIMIT_MAX
рдЕрдзрд┐рдХрддрдо рдЬреЛ рдкреБрд░рд╛рдирд╛_рдореЙрд▓реЛрдХ_рд▓рд┐рдорд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 128 * 1024 * 1024 (128MB) рд╣реИред



рдореЗрдореЛрд░реА рд▓реАрдХ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯрд╕реНрдкреЗрд╕ рдХреНрд▓рд╛рд╕


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



рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╕реНрдерд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:



 require "objspace" module Example class User def initialize(first_name, last_name) @first_name, @last_name = first_name, last_name end def name "#{@first_name} #{@last_name}" end end end ObjectSpace.trace_object_allocations do obj = Example::User.new("Arthur", "Dent").name ObjectSpace.allocation_sourcefile(obj) #=> "example.rb" ObjectSpace.allocation_sourceline(obj) #=> 10 ObjectSpace.allocation_class_path(obj) #=> "Example::User" ObjectSpace.allocation_method_id(obj) #=> :name ObjectSpace.allocation_generation(obj) #=> 6 end
      
      





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



рдПрдХ рдмреНрд▓реЙрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЗ рд╕рд╛рде рдЯреНрд░реЗрд╕_рдмрд┐рдЬрдЯ_рдСрд▓реЛрдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреНрд░реЗрд╕_рдмрдЬреЗрдХреНрдЯ_рдСрд▓реЛрдХреЗрд╢рди_рд╕реНрдЯрд╛рд░реНрдЯ рдФрд░ рдЯреНрд░реЗрд╕_рдмреЛрдХреЗрд╢рди_рдСрд▓реЛрдХреЗрд╢рди_рд╕реНрдЯреЙрдк рддрд░реАрдХреЗ рднреА рд╣реИрдВ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрд╕_рдмрдЬреЗрдХреНрдЯ_рдСрд▓реЛрдХреЗрд╢рди_рдХреНрд▓реЗрдпрд░ред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЗрд╕реЗ рдФрд░ рди рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд▓рд╛рдЗрди рдореЗрдВ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╛ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред



 require "objspace" ObjectSpace.trace_object_allocations do puts ObjectSpace.dump(["foo"].freeze) end
      
      





рд▓рд╛рдПрдЧрд╛

 { "address": "0x007fd122123f40", "class": "0x007fd121072098", "embedded": true, "file": "example.rb", "flags": { "wb_protected": true }, "frozen": true, "generation": 6, "length": 1, "line": 4, "references": [ "0x007fd122123f68" ], "type": "ARRAY" }
      
      





рдвреЗрд░ рдкрд░ рд╕рднреА рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ObjectSpace.dump_all рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред



 require "objspace" ObjectSpace.trace_object_allocations_start # do things ... ObjectSpace.dump_all(output: File.open("heap.json", "w"))
      
      





рдЗрди рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрди рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдПрдЧреАред



рдЕрдВрдд рдореЗрдВ, ObjectSpace.reachable_objects_from_root рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ ObjectSpace.reachable_objects_from рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реВрдЯ рд╕реЗ рдХреЛрдИ рддрд░реНрдХ рдФрд░ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдпрд╣ рдПрдХ рд╣реИрд╢ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЪрд╛рдмрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдВрдЪрддреЗ рд╕рдордп, рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рд╕рдорд╛рди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рд╣рд╢ рдореЗрдВ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



 require "objspace" reachable = ObjectSpace.reachable_objects_from_root reachable = {}.merge(reachable) # workaround compare_by_identity reachable["symbols"] #=> ["freeze", "inspect", "intern", ...
      
      





рдЗрд╕ рдкрд░ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЕрдЧрд▓рд╛ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛, рдЗрд╕рдореЗрдВ рд╢реЛрдзрди, рдирдП рд░реВрдмреАрдЬ, рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╣реЛрдЧрд╛ред



рднрд╛рдЧ рджреЛ рднрд╛рдЧ рддреАрди



All Articles