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



рд╢реЛрдзрди


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



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



module NumberQuery refine String do def number? match(/\A(0|-?[1-9][0-9]*)\z/) ? true : false end end end module Example using NumberQuery "42".number? #=> true end module Example "42".number? #=> #<NoMethodError: undefined method `number?' for "42":String> end
      
      





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



 module BlankQuery refine Object do def blank? respond_to?(:empty?) ? empty? : false end end refine String do def blank? strip.length == 0 end end refine NilClass do def blank? true end end end module NumberQuery refine Object do def number? false end end refine String do def number? match(/\A(0|-?[1-9][0-9]*)\z/) ? true : false end end refine Numeric do def number? true end end end module Support include BlankQuery include NumberQuery end class User using Support # ... def points=(obj) raise "points can't be blank" if obj.blank? raise "points must be a number" unless obj.number? @points = obj end end
      
      







рд╕реНрдЯреНрд░рд┐рдВрдЧ # рд╕реНрдХреНрд░рдм


рдЕрдорд╛рдиреНрдп рдмрд╛рдЗрдЯ рд╡рд╛рд▓реЗ рддрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдмреА 2.1 рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ # рд╕реНрдХреНрд░рдм рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред



 # create a string that can't be sensibly printed # 'latin 1' encoded string with accented character string = "├╢ops".encode("ISO-8859-1") # misrepresented as UTF-8 string.force_encoding("UTF-8") # and mixed with a UTF-8 character string = "┬б#{string}!"
      
      





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



рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реА "рдпрд╛рддреНрд░рд╛" рдХрд╛ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╣реИ, рддреЛ рд╣рдо рдЕрдм рд╕рднреА рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрдо рд╕реЗ рдХрдо рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ:



 # replace with 'replacement character' string.scrub #=> "┬б ops!" # delete string.scrub("") #=> "┬бops!" # replace with chosen character string.scrub("?") #=> "┬б?ops!" # yield to a block for custom replacement # (in this case the invalid bytes as hex) string.scrub {|bytes| "<#{bytes.unpack("H*").join}>"} #=> "┬б<f6>ops!"
      
      





рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд░реНрддрдорд╛рди рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдЕрдорд╛рдиреНрдп рдХреЗ рд╕рд╛рде #encoding рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :: рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:



 string.encode("UTF-8", invalid: :replace) #=> "┬б ops!" string.encode("UTF-8", invalid: :replace, replace: "?") #=> "┬б?ops!"
      
      







Bignum / рддрд░реНрдХрд╕рдВрдЧрдд рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░


Bignum рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рдХрдХреНрд╖рд╛рдПрдВ рдЕрдм рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП GNU рдорд▓реНрдЯреАрдкрд▓ рдкреНрд░рд┐рд╕рд┐рдЬрди рдЕрд░рд┐рдердореЗрдЯрд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (GMP) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред



рд╕реНрддрд░ 4 рдиреЗ $ рд╕реЗрдл рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛


$ SAFE = 4 рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рд░реВрдмреА рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЛрдб рдореЗрдВ рдбрд╛рд▓рдирд╛ рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреБрднрд╛рд╖рд┐рдпрд╛ рднрд░ рдореЗрдВ рдмрд┐рдЦрд░реЗ рд╣реБрдП рдХреЛрдб рдХреА рдХрд╛рдлреА рдорд╛рддреНрд░рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рд▓рдЧрднрдЧ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдВрддрддрдГ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



 $SAFE = 4 #=> #<ArgumentError: $SAFE=4 is obsolete>
      
      







clock_gettime


рд░реВрдмреА рдиреЗ.c.c__gettime рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШрдбрд╝реА_рдЧреЗрдЯрдЯрд╛рдЗрдо () рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рджрд┐рдирд╛рдВрдХ рдорд╛рдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЯрд╛рдЗрдо рдЖрдИрдбреА рдХреЛ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:



 Process.clock_gettime(Process::CLOCK_REALTIME) #=> 1391705719.906066
      
      





рдкреНрд░рдХреНрд░рд┐рдпрд╛ :: CLOCK_REALTIME рдкрд╛рд╕ рдХрд░рдХреЗ, рдЖрдкрдХреЛ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдпреВрдирд┐рдХреНрд╕ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ Time.now.to_f рдХреЗ рдЕрдиреБрд░реВрдк рднреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рддреЗрдЬрд╝ рдЪрд▓реЗрдЧрд╛ред



Process.clock_gettime рдХрд╛ рдЙрдкрдпреЛрдЧ "рдиреАрд░рд╕" рдШрдбрд╝реА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдШрдбрд╝реА рдХреЗ рдЕрдиреБрд╡рд╛рдж рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдордп рдорд╛рдкрди рдпрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдиреАрд░рд╕ рдШрдбрд╝реА рдХрд╛ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рддрднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╣реА рд╕рдорд╛рди рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ:



 start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) sleep 1 Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time #=> 1.0051147330086678
      
      





рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдФрд░ рдореВрд▓реНрдп CLOCK_PROCESS_CPUTIME_ID рд╣реИред рдпрд╣ рдПрдХ рдореЛрдиреЛрдЯреЛрди рдШрдбрд╝реА рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрдм рдмрдврд╝рддрд╛ рд╣реИ рдЬрдм рд╕реАрдкреАрдпреВ рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЪрд┐рд╣реНрди рдЕрдиреНрдп рд╕рдорд╛рди рдЪрд┐рд╣реНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред



 start_time = Process.clock_gettime(Process::CLOCK_PROCESS_CPUTIME_ID) sleep 1 Process.clock_gettime(Process::CLOCK_PROCESS_CPUTIME_ID) - start_time #=> 0.005225999999999981
      
      





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



рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдШрдбрд╝реА рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред



 Process.const_defined?(:CLOCK_PROCESS_CPUTIME_ID) #=> true Process.const_defined?(:CLOCK_THREAD_CPUTIME_ID) #=> false
      
      





Process.clock_getres рд╡рд┐рдзрд┐ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдШрдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред



RubyGems рдЕрдкрдбреЗрдЯ


RubyGems рдХреЗ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 2.2 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред RubyGems рдореЗрдВ рд╕рднреА рдмреБрдВрджрд▓рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ Gemfile.lock рд╕рдорд░реНрдерди рдХреЛ Gemfile рд╕рдорд░реНрдерди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред



рдордгрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП --file (рдпрд╛ -g) рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЕрдм рдирд┐рд░реНрднрд░рддрд╛ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ Gemfile рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдордгрд┐ рд╕реНрдерд╛рдкрд┐рдд рднреА Gemfile.lock рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред



 $ ls Gemfile $ gem install -g Fetching: going_postal-0.1.4.gem (100%) Installing going_postal (0.1.4) $ ls Gemfile Gemfile.lock
      
      





рдЗрддрд┐рд╣рд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред



рд╣рдЯрд╛рдП рдЧрдП рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд░реЗрдХ


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



рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд░реЗрдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ 10.0.3 рдФрд░ 10.1.0 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦреЗрдВред



RDoc рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ


рд░реВрдмреА рдореЗрдВ рдЕрдм RDoc рд╕рдВрд╕реНрдХрд░рдг 4.1 рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЕрдкрдбреЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрддрд┐рд╣рд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред



рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо


рдПрдХ рдирдИ Process.setproctitle рдкрджреНрдзрддрд┐ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ $ 0 рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред $ 0 рдХрд╛ рдореВрд▓ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Process.argv0 рд╡рд┐рдзрд┐ рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдореНрди рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ:



 data.each_with_index do |datum, i| Process.setproctitle("#{Process.argv0} - job #{i} of #{data.length}") process(datum) end
      
      





рддрдм рдЬрдм рдЖрдк рдкреАрдПрд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:



 $ ps PID TTY TIME CMD 339 ttys000 0:00.23 -bash 7321 ttys000 0:00.06 background.rb - job 10 of 30
      
      







рдЬрдореЗ рд╣реБрдП рдкреНрд░рддреАрдХ


рдкреНрд░рддреАрдХ рд╡рд╕реНрддреБрдПрдВ рдЕрдм рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рдХрдВрдкрдиреА рдмрдирд╛рддреА рд╣реИрдВ, рдЬреЛ "рдлреНрд░реЛрдЬрди" (рдЬрдореА рд╣реБрдИ) рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред



 :foo.frozen? #=> true :foo.instance_variable_set(:@bar, "baz") #=> #<RuntimeError: can't modify frozen Symbol>
      
      





рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд░реВрдмреА рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рд╕реНрдХреЛрдк рд▓реАрдХ рддрдп


рдирд┐рдЬреА, рд╕рдВрд░рдХреНрд╖рд┐рдд, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ, рдпрд╛ рдореЙрдбреНрдпреВрд▓_рдлрдВрдХреНрд╢рди рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ eval, example_eval рдпрд╛ рдореЙрдбреНрдпреВрд▓_eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рдзрд┐ рдХрд╛ рджрд╛рдпрд░рд╛ рдореВрд▓ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП "рдкреНрд░рд╡рд╛рд╣", рдЕрд░реНрдерд╛рддреНред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлреВ рд╡рд┐рдзрд┐ рдирд┐рдЬреА рд╣реЛрдЧреА:



 class Foo eval "private" def foo "foo" end end
      
      





рд╕рдВрд╕реНрдХрд░рдг 2.1 рдореЗрдВ, рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдлреВ рдЦреБрд▓реЗ рд░рд╣реЗрдВрдЧреЗред



#untrusted? рдЕрдм # рдкрд░рд┐рддреНрдпрдХреНрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ?


рд░реВрдмреА рдореЗрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдереЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ #tainst; #taint рдФрд░ #untaint рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рдереЗ, рджреВрд╕рд░реЗ рдореЗрдВ #untrusted ;, #untrust рдФрд░ #trust рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡реЗ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред



рдЕрдм рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдЭрдВрдбреЗ рдХреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ #tainted рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реИ? рдФрд░ рдХрдВрдкрдиреА, рдФрд░ рдЬрдм рдлреЛрди #untrusted? рдФрд░ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред



 string = "foo" string.untrust string.tainted? #=> true
      
      





рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛



 example.rb:2: warning: untrust is deprecated and its behavior is same as taint
      
      







рдореЗрдордиреЛрдВ рдореЗрдВ рд▓реМрдЯреЗрдВ


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



 def call_with_yield yield end def test call_with_yield(&lambda {return "hello from lambda"}) "hello from method" end test #=> "hello from method"
      
      





рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд░реВрдмреА <= 2.0.0 рдХреЗ рд▓рд┐рдП "рд▓рдВрдмреЛ рд╕реЗ рд╣реИрд▓реЛ" рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред



рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрддреЗ


рдЕрдм рдЖрдк Socket.getifaddrs рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реЙрдХреЗрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ :: ifaddr рдСрдмреНрдЬреЗрдХреНрдЯред



 require "socket" info = Socket.getifaddrs.find do |ifaddr| (ifaddr.flags & Socket::IFF_BROADCAST).nonzero? && ifaddr.addr.afamily == Socket::AF_INET end info.addr.ip_address #=> "10.0.1.2"
      
      







StringScanner рдореЗрдВ рдирд╛рдорд┐рдд рд╕рдореВрд╣ рдХрд╛ рд╕рдорд░реНрдерди


StringScanner # [] рдЕрдм рдкреНрд░рддреАрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рдорд┐рдд рд╕рдореВрд╣реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред



 require "strscan" def parse_ini(string) scanner = StringScanner.new(string) current_section = data = {} until scanner.eos? scanner.skip(/\s+/) if scanner.scan(/;/) scanner.skip_until(/[\r\n]+/) elsif scanner.scan(/\[(?<name>[^\]]+)\]/) current_section = current_section[scanner[:name]] = {} elsif scanner.scan(/(?<key>[^=]+)=(?<value>.*)/) current_section[scanner[:key]] = scanner[:value] end end data end
      
      







YAML.safe_load


YAML (рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╕рд╛рдЗрдХ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдореЗрдВ, safe_load рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рдЧрдИ рдереАред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдирд┐рдореНрди рд╡рд░реНрдЧреЛрдВ рдХреЛ deserialized рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: TrueClass, FalseClass, NilClass, Numeric, String, Array рдФрд░ Hashред рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЛ рдбрд┐рд╕реЗрд░реНрдмрд▓рд╛рдЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЙрдирдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдпрджрд┐ рдПрдХ рдЕрдирд╕реБрд▓рдЭреЗ рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рд╛рдЗрдХ :: DisallowedClass рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ YAML :: DisallowedClass рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



 require "yaml" YAML.safe_load(":foo: 1") #=> #<Psych::DisallowedClass: Tried to load unspecified class: Symbol> YAML.safe_load(":foo: 1", [Symbol]) #=> {:foo=>1}
      
      







Resolv рдореЗрдВ MDNS рдФрд░ LOC рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди


Resolv DNS рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ DNS рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╕рдорд░реНрдерди рдорд┐рд▓рд╛ рд╣реИред рдпрд╣ рдирд┐рд░рдВрддрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реЗрд╡рд╛ рдЦреЛрдЬ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╡рд╛рдЪрд╛рд░ рд╣реИ (DNS рд╕реЗрд╡рд╛ рдбрд┐рд╕реНрдХрд╡рд░реА рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП, dnssd рдордгрд┐ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)ред



 require "resolv" resolver = Resolv::MDNS.new resolver.getaddress("example.local") #=> #<Resolv::IPv4 10.0.1.2>
      
      





Resolv- рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдВрдХ рдЖрдкрдХреЛ рд░реВрдмреА рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЗрдЯрд╡рд░реНрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде mDNS рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



 require "resolv-replace" require "net/http" Resolv::DefaultResolver.replace_resolvers([Resolv::Hosts.new, Resolv::MDNS.new]) Net::HTTP.get_response(URI.parse("http://example.local")) #=> #<Net::HTTPOK 200 OK readbody=true>
      
      





рд░рд┐рдЬрд╝реЙрд▓реНрд╡ рдХреЛ DNS LOC рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдорд┐рд▓реАред



 require "resolv" dns = Resolv::DNS.new # find.me.uk has LOC records for all UK postcodes resource = dns.getresource("W1A1AA.find.me.uk", Resolv::DNS::Resource::IN::LOC) resource.latitude #=> #<Resolv::LOC::Coord 51 31 6.827 N> resource.longitude #=> #<Resolv::LOC::Coord 0 8 37.585 W>
      
      





рдЕрдВрдд рдореЗрдВ, Resolv рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди, рдЖрдк рдЕрдм Resolv :: DNS # fetch_resource рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реНрдг DNS рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



 require "resolv" dns = Resolv::DNS.new dns.fetch_resource("example.com", Resolv::DNS::Resource::IN::A) do |reply, reply_name| reply #=> #<Resolv::DNS::Message:0x007f88192e2cc0 @id=55405, @qr=1, @opcode=0, @aa=0, @tc=0, @rd=1, @ra=1, @rcode=0, @question=[[#<Resolv::DNS::Name: example.com.>, Resolv::DNS::Resource::IN::A]], @answer=[[#<Resolv::DNS::Name: example.com.>, 79148, #<Resolv::DNS::Resource::IN::A:0x007f88192e1c80 @address=#<Resolv::IPv4 93.184.216.119>, @ttl=79148>]], @authority=[], @additional=[]> reply_name #=> #<Resolv::DNS::Name: example.com.> end
      
      







рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢


рд╕реЙрдХреЗрдЯ рдкрддреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред



 require "socket" TCPSocket.new("localhost", 8080) #=> #<Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 8080>
      
      







рддреНрд╡рд░рд┐рдд рд╣реИрд╢ # рд╢рд┐рдлреНрдЯ


рд╣реИрд╢ # рд╢рд┐рдлреНрдЯ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рдлреА рдмрдврд╝ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд░реВрдмреА 1.9 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕рдореНрдорд┐рд▓рд┐рдд рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ LRU рдХреИрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред



 class LRUCache def initialize(size) @size, @hash = size, {} end def [](key) @hash[key] = @hash.delete(key) end def []=(key, value) @hash.delete(key) @hash[key] = value @hash.shift if @hash.size > @size end end
      
      







рдХрддрд╛рд░, SizedQueue, рдФрд░ ConditionVariable рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░


рдХреНрдпреВ (рдкреВрд░реНрд╡ рдореЗрдВ рд░реВрдмреА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдХрддрд╛рд░, SizedQueue рдФрд░ ConditionVariable рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЧрддрд┐ рджреА рдЧрдИ рд╣реИред



рдЯрд╛рдЗрдордЖрдЙрдЯ рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЕрд╡рд░реЛрдзрди


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



 require "timeout" begin Timeout.timeout(1) do begin sleep 2 rescue Exception # no longer swallows the timeout exception end end rescue StandardError => e e #=> #<Timeout::Error: execution expired> end
      
      







рд╕реЗрдЯ


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



 require "set" a = Set[1,2,3] b = Set[3,4,5] c = Set[4,5,6] a.intersect?(b) #=> true b.intersect?(c) #=> true a.intersect?(c) #=> false a.disjoint?(b) #=> false b.disjoint?(c) #=> false a.disjoint?(c) #=> true
      
      





рд╕реЗрдЯ рдкрд░ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдпрд╣ рд╣реИ рдХрд┐ #to_set рдкрджреНрдзрддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рд▓реМрдЯрд╛рдПрдЧреА, рди рдХрд┐ рдмрдирд╛рдИ рдЧрдИ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ред



 require "set" set = Set["foo", "bar", "baz"] set.object_id #=> 70286489985620 set.to_set.object_id #=> 70286489985620
      
      







рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╡реЗрдмрдмреНрд░рд┐рдХ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рдЕрдм WEBrick рд╕реЗ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╢рд░реАрд░ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ #read рдФрд░ #readpartial рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ, рдпреЗ рдХреЗрд╡рд▓ IO рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ 10 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╣рд░ рд╕реЗрдХрдВрдб рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред



 require "webrick" class EnumeratorIOAdapter def initialize(enum) @enum, @buffer, @more = enum, "", true end def read(length=nil, out_buffer="") return nil unless @more until (length && @buffer.length >= length) || !fill_buffer; end if length part = @buffer.slice!(0, length) else part, @buffer = @buffer, "" end out_buffer.replace(part) end def readpartial(length, out_buffer="") raise EOFError if @buffer.empty? && !fill_buffer out_buffer.replace(@buffer.slice!(0, length)) end private def fill_buffer @buffer << @enum.next rescue StopIteration @more = false end end server = WEBrick::HTTPServer.new(Port: 8080) server.mount_proc "/" do |request, response| enum = Enumerator.new do |yielder| 10.times do sleep 1 yielder << "#{Time.now}\r\n" end end response.chunked = true response.body = EnumeratorIOAdapter.new(enum) end trap(:INT) {server.shutdown} server.start
      
      







рдиреНрдпреВрдореЗрд░рд┐рдХ # рд╕реНрдЯреЗрдк


рдиреНрдпреВрдореЗрд░рд┐рдХ рдХреНрд▓рд╛рд╕ рдХрд╛ # рд╕реНрдЯреЗрдк рддрд░реАрдХрд╛ рдЕрдм рд╕реНрдерд┐рддрд┐рдпреБрдХреНрдд рддрд░реНрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп: рдФрд░ рд╕реЗ: рддрдХ рдХреЗ рдирд╛рдо рддрд░реНрдХреЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рд╕реЗ: рддрд░реНрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ; рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдиреБрдХреНрд░рдо рдЕрдирдВрдд рд╣реЛрдЧрд╛ред рд╕реНрдереИрддрд┐рдХ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдирд┐рд▓ рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



 0.step(by: 5, to: 20) do |i| puts i end
      
      





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



 0 5 10 15 20
      
      





 0.step(by: 3) do |i| puts i end 0.step(nil, 3) do |i| puts i end
      
      





рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ



 0 3 6 9 12 ... and so on
      
      







рдЖрдИрдУ


IO # рдХрд╛рдВрд╕реНрдЯреЗрдВрдЯ IO рдХреЗ рд╕рд╛рде рдЕрдм рдЖрдИрдУ :: SEEK_CUR, IO :: SEEK_END рдФрд░ IO :: SEEK_SET рдкреНрд░рддреАрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: CUR ,: END рдФрд░: SET рдСрдмреНрдЬреЗрдХреНрдЯ



рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, IO :: SEEK_DATA рдФрд░ IO :: SEEK_HOLE (рдпрд╛: DATA рдФрд░: HOLE) рдХреЛ рдЕрдм рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдбреЗрдЯрд╛ / рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



 f = File.new("example.txt") # sets the offset to the start of the next data chunk at least 8 bytes long f.seek(8, IO::SEEK_DATA) # sets the offset to the start of the next empty space at least 32 bytes long f.seek(32, IO::SEEK_HOLE)
      
      





рдпрд╣ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ IO.const_defined рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? (: SEEK_DATA) рдФрд░ IO.const_defined? (: SEEK_HOLE)ред



рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХреЗ рдмрд┐рдирд╛ IO _nonblock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


IO # read_nonblock рдФрд░ IO # write_nonblock рд╡рд┐рдзрд┐рдпрд╛рдБ рдПрдХ рдирд╛рдорд╛рдВрдХрд┐рдд рдЕрдкрд╡рд╛рдж рд▓реЗ рд╕рдХрддреА рд╣реИрдВ: рддрд░реНрдХред рдпрджрд┐ рдпрд╣ рдЧрд▓рдд (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рддреНрдп) рдкрд░ рд╕реЗрдЯ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдХ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред



 require "socket" io = TCPSocket.new("www.example.com", 80) message = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n" loop do IO.select(nil, [io]) result = io.write_nonblock(message, exception: false) break unless result == :wait_writeable end response = "" loop do IO.select([io]) result = io.read_nonblock(32, exception: false) break unless result next if result == :wait_readable response << result end puts response.lines.first
      
      







рдмрд╛рд╣рд░реА ASCII-8BIT рдЕрдЧрд░ IO рдЖрдВрддрд░рд┐рдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ


рдпрджрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░реВрдмреА рдмрд╛рд╣рд░реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреАред рдЕрдкрд╡рд╛рдж рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдмрд╛рд╣рд░реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ ASCII-8BIT рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред



рдпрджрд┐ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ IO рдкрджреНрдзрддрд┐ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╣реА рдЕрдкрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмрдЧ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



 File.read("example.txt", encoding: "ascii-8bit:utf-8").encoding #=> #<Encoding:ASCII-8BIT>
      
      







#include рдФрд░ #prepend рдЕрдм рдЦреБрд▓реЗ рд╣реИрдВ


#Include рдФрд░ #prepend рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдм рдЦреБрд▓реА рд╣реИрдВ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдХреНрд▓рд╛рд╕ рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред



 module NumberQuery def number? match(/\A(0|-?[1-9][0-9]*)\z/) ? true : false end end String.include(NumberQuery) "123".number? #=> true
      
      





 require "bigdecimal" module FloatingPointFormat def to_s(format="F") super end end BigDecimal.prepend(FloatingPointFormat) decimal = BigDecimal("1.23") decimal.to_s #=> "1.23" # rather than "0.123E1"
      
      







рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдирдП рддрд░реАрдХреЗ, рдиреЗрдЯрд╡рд░реНрдХ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЕрдиреНрдп рдЕрдкрдбреЗрдЯ рд╣реЛрдВрдЧреЗред

рднрд╛рдЧ рдПрдХ рднрд╛рдЧ рддреАрди



All Articles