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



# рд╕рд┐рдВрдЧрд┐рдВрдЧрдЯрди_рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐? рдореЙрдбреНрдпреВрд▓ / рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП


#Singleton_class; рдкрджреНрдзрддрд┐ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдХреНрд▓рд╛рд╕ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдк рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд░рд┐рдЯрд░реНрди рдПрдХ рдореЗрдЯрд╛-рдХреНрд▓рд╛рд╕ (рд╕рд┐рдВрдЧрд▓рдЯрди) рд╣реИ



class Example singleton_class? #=> false class << self singleton_class? #=> true end end
      
      







рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдореЙрдбреНрдпреВрд▓ # рдкреВрд░реНрд╡рдЬреЛрдВ


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



 Object.ancestors.include?(Object) #=> true Object.singleton_class.ancestors.include?(Object.singleton_class) #=> true
      
      







рдСрдмреНрдЬреЗрдХреНрдЯ # рд╕рд┐рдВрдЧрд▓рдЯрди_рдореЗрдереЛрдб


# рдореИрдереЛрдб рдФрд░ # рдЖрдЗрдВрд╕реНрдЯреАрди_рдореЗрдереЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореЗрдЯрд╛ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИ



 class Example def self.test end def test2 end end # returns class method Example.singleton_method(:test) #=> #<Method: Example.test> # doesn't return instance method Example.singleton_method(:test2) #=> #<NameError: undefined singleton method `test2' for `Example'> # doesn't return inherited class method Example.singleton_method(:name) #=> #<NameError: undefined singleton method `name' for `Example'>
      
      







 example = Object.new def example.test end example.singleton_method(:test) #=> #<Method: #<Object:0x007fc54997a610>.test>
      
      







рд╡рд┐рдзрд┐ # рдУрд░рд┐рдЬрд┐рдирд▓_рдирд╛рдо


#Original_name рдкрджреНрдзрддрд┐ рдореЗрдердб рдФрд░ рдЕрдирдмрд╛рдЙрдВрдбрдореЗрдереЛрдб рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рд╣реИ, рдЬреЛ рдмрд┐рдирд╛ рдЙрдкрдирд╛рдо рдХреЗ рд╡рд┐рдзрд┐ рдирд╛рдо рджреЗрддрд╛ рд╣реИред



 class Example def foo "foo" end alias bar foo end example = Example.new example.method(:foo).original_name #=> :foo example.method(:bar).original_name #=> :foo Example.instance_method(:bar).original_name #=> :foo
      
      







Mutex # рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реИ?


рдореНрдпреВрдЯреЗрдХреНрд╕ # рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ ? рдпрд╣ рдЕрдм рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред



рд╣реИрд╢ # рд░рд┐рдЬреЗрдХреНрдЯ


рд╣реИрд╢ рдХреЗ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рдореЗрдВ рд╣реИрд╢ # рдЕрд╕реНрд╡реАрдХрд╛рд░ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ vorning рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛ред рд░реВрдмреА 2.2 рдореЗрдВ, рд╣реИрд╢ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ #reject рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдирдИ рд╣реИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛, рди рдХрд┐ рд╕рдмрдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ, рдЕрдм рддрдХ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИред



 class MyHash < Hash end example = MyHash.new example[:a] = 1 example[:b] = 2 example.reject {|k,v| v > 1}.class #=> MyHash
      
      





рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА:



 example.rb:8: warning: copying unguaranteed attributes: {:a=>1, :b=>2} example.rb:8: warning: following atributes will not be copied in the future version: example.rb:8: warning: subclass: MyHash
      
      





рд░реВрдмреА 2.1.1 рдореЗрдВ, рдПрдХ рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдЧрд▓рддреА рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рд╣реИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ corroding рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 2.1.2 рдореЗрдВ рдпрд╣ рд╡рд╛рдкрд╕ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рд╡реЗрдХреНрдЯрд░ # cross_product


рдХреНрд░реЙрд╕_рдкреНрд░реЛрдбрдХреНрдЯ рдкрджреНрдзрддрд┐ рдХреЛ рд╡реЗрдХреНрдЯрд░ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред



 require "matrix" Vector[1, 0, 0].cross_product(Vector[0, 1, 0]) #=> Vector[0, 0, -1]
      
      







рдлрд╝рд┐рдХреНрдирдо / рдмрд┐рдЧреНрдирдо #bit_length


рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ #bit_length рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрд╛рдЗрдирд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред



 128.bit_length #=> 8 32768.bit_length #=> 16 2147483648.bit_length #=> 32 4611686018427387904.bit_length #=> 63
      
      







рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреИрдХ / рдЕрдирдкреИрдХ рдФрд░ рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡


рд╕рд░рдгреА # рдкреИрдХ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ # рдЕрдирдкреИрдХ рддрд░реАрдХреЗ рдЕрдм Q_ / Q рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдФрд░ q_ / qред



 # output may differ depending on the endianness of your system unsigned_long_long_max = [2**64 - 1].pack("Q!") #=> "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" signed_long_long_min = [-2**63].pack("q!") #=> "\x00\x00\x00\x00\x00\x00\x00\x80" signed_long_long_max = [2**63 - 1].pack("q!") #=> "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F" unsigned_long_long_max.unpack("Q!") #=> 18446744073709551615 signed_long_long_min.unpack("q!") #=> -9223372036854775808 signed_long_long_max.unpack("q!") #=> 9223372036854775807
      
      







Dir.glob рдпреМрдЧрд┐рдХ рд╡рд░реНрдг рджреЗрддрд╛ рд╣реИ


рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдкрд░ рдПрдЪрдПрдлрдПрд╕ рдкреНрд▓рд╕ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП UTF8-MAC рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИ рдХреЛ рдпреВ рдФрд░ рдпреВ + 0301 рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдпреВ + 00 рдИ 9 ( рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде )ред Dir.glob рдФрд░ Dir [] рдЕрдм рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХрдВрдкрд╛рдЙрдВрдб рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде UTF8 рддрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред



 File.write("composed_e\u{301}xample.txt", "") File.write("precomposed_\u{e9}xample.txt", "") puts Dir["*"].map(&:dump)
      
      





 "composed_\u{e9}xample.txt" "example.rb" "precomposed_\u{e9}xample.txt"
      
      







рдиреНрдпреВрдореЗрд░рд┐рдХ # рдХреНрд╡реЛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд╕реНрдЯрд┐рдВрдЧ


рдиреНрдпреВрдореЗрд░рд┐рдХ # рдХреНрд╡реЛ рд╡рд┐рдзрд┐ рдЕрдм рд░рд┐рд╕реАрд╡рд░ рдкрд░ #to_r рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕реЗ рджреЗрд╢реА рдиреНрдпреВрдореЗрд░рд┐рдХ рдЙрдкрд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рдпрджрд┐ рдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдк-рдЗрдпрд░рд░реЛрдб рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рди рдХрд┐ рдПрдХ рдЖрд░реНрдЧреНрдпреВрдореЗрдВрдЯ рдПрд░рд░, рдЬреЛ рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ TypeError ArgumentError рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╣реИред



рдмрдВрдзрди # рд╕реНрдерд╛рдиреАрдп_рд╡рд░реНрдгреАрдп_рдЧреЗрдЯ / _set / _defined?


рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡рд░реНрдЧ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ / рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╛рдорд┐рдд рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред



 def primes(begin: 2, end: 1000) [binding.local_variable_get(:begin), 2].max.upto(binding.local_variable_get(:end)).each_with_object([]) do |i, array| array << i unless (2...i).any? {|j| (i % j).zero?} end end primes(end: 10) #=> [2, 3, 5, 7]
      
      





рдпрд╛ рдпрджрд┐ рдЖрдк рдЪрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп:



 def make_binding(hash) b = TOPLEVEL_BINDING.dup hash.each {|k,v| b.local_variable_set(k, v)} b end require "erb" cover = %Q{<h1><%= title %></h1>\n<h2 class="big friendly"><%= subtitle %></h2>} locals = {:title => "Hitchhiker's Guide to the Galaxy", :subtitle => "Don't Panic"} ERB.new(cover).result(make_binding(locals)) #=> "<h1>Hitchhiker's Guide to the Galaxy</h1>\n<h2 class=\"big friendly\">Don't Panic</h2>"
      
      







CGI рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдм CGI :: Util рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ


CGI рдХреНрд▓рд╛рд╕ рдореЗрдВ url рдФрд░ html рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ CGI :: Util рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдпрд╛ рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



 require "cgi/util" CGI.escape("hello world!") #=> "hello+world%21" include CGI::Util escape("hello world!") #=> "hello+world%21"
      
      







рдбрд╛рдЗрдЬреЗрд╕реНрдЯ :: рдХреНрд▓рд╛рд╕.рдлрд╛рдЗрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ


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



 require "digest" Digest::SHA2.new(512).hexdigest(File.read("example.txt")) #=> "f7fbba..."
      
      





рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:



 require "digest" Digest::SHA2.file("example.txt", 512).hexdigest #=> "f7fbba..."
      
      







рдиреЗрдЯ :: SMTP # rset


рдЕрдм рдЖрдк рдиреЗрдЯ :: SMTP # rset рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ RSET рдХрдорд╛рдВрдб рднреЗрдЬрдХрд░ SMTP рд▓реЗрдирджреЗрди рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



 require "net/smtp" smtp = Net::SMTP.start("some.smtp.server") notification = "Hi %s,\n ..." users.each do |user| begin smtp.mailfrom("noreply@example.com") smtp.rcptto(user.email) smtp.data(sprintf(notification, user.name)) rescue smtp.rset end end smtp.finish
      
      







open-uri рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реЗрдбрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ


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



 require "open-uri" f = open("http://google.com") f.meta["set-cookie"].class #=> String f.metas["set-cookie"].class #=> Array f.metas["set-cookie"].length #=> 2
      
      







Pathname рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдирд╛


рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП #write рдФрд░ #binwrite рддрд░реАрдХреЛрдВ рдХреЛ Pathname рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред



 require "pathname" path = Pathname.new("test.txt").expand_path(__dir__) path.write("foo") path.write("bar", 3) # offset path.write("baz", mode: "a") # append
      
      







Tempfile.create


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



 require "tempfile" path = nil Tempfile.create("example") do |f| f #=> #<File:/tmp/example20140428-16851-15kf046> path = f.path end File.exist?(path) #=> false
      
      







рд░рд┐рдВрдбрд╛ рдореЗрдВ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рд╕рдкреЛрд░реНрдЯ


Rinda Ring рдХреНрд▓рд╛рд╕реЗрдЬ рдЕрдм рдЧреНрд░реБрдк рдПрдбреНрд░реЗрд╕ рдХреЛ рд╕реБрди / рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИрдВред



рдиреАрдЪреЗ 239.0.0.1 рдХреЗ рдмрд╣реБрд╕реНрддрд░реАрдп рдкрддреЗ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗрд╡рд╛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдВрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ



 require "rinda/ring" require "rinda/tuplespace" DRb.start_service tuple_space = Rinda::TupleSpace.new server = Rinda::RingServer.new(tuple_space, ["239.0.0.1"]) DRb.thread.join
      
      





рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХрд░рдг:



 require "rinda/ring" DRb.start_service ring_finger = Rinda::RingFinger.new(["239.0.0.1"]) tuple_space = ring_finger.lookup_ring_any tuple_space.write([:message_service, "localhost", 8080]) # start messaging service on localhost:8080
      
      





рд╕реЗрд╡рд╛ рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:

 require "rinda/ring" DRb.start_service ring_finger = Rinda::RingFinger.new(["239.0.0.1"]) tuple_space = ring_finger.lookup_ring_any _, host, port = tuple_space.read([:message_service, String, Fixnum]) # connect to messaging service
      
      





рдореБрдЭреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ tuple_space = ring_finger.lookup_ring_any рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛:



 tuple_space = nil ring_finger.lookup_ring(0.01) {|x| break tuple_space = x}
      
      







XMLRPC рдХреЗ рд▓рд┐рдП рдЙрдиреНрдирдд HTTP рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд░рдирд╛


XMLRPC :: рдХреНрд▓рд╛рдЗрдВрдЯ # http рдПрдХ рдиреЗрдЯ :: HTTP рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред



 client = XMLRPC::Client.new("example.com") client.http.keep_alive_timeout = 30 # keep connection open for longer # use client ...
      
      







URI.encode_ / decode_www_form рдХреЛ рдорд╛рдирдХ WHATWG рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛


URI.encode_www_form рдФрд░ URI.decode_www_form рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ WHATWG рдорд╛рдирдХ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



URI.decode_www_form рдЕрдм рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИ ;



рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд░реВрдк рдореЗрдВ, &



рдХреЗрд╡рд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реАрдорд╛рдВрдХрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рдирд╛рдорд┐рдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕реАрдорд╛рдВрдХрдХ рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:ред



 require "uri" URI.decode_www_form("foo=1;bar=2", separator: ";") #=> [["foo", "1"], ["bar", "2"]]
      
      





URI.decode_www_form рдЕрдм URI.encode_www_form рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдбрд┐рдХреЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИред



 require "uri" string = URI.encode_www_form(foo: 1, bar: nil, baz: 3) #=> "foo=1&bar&baz=3" URI.decode_www_form("foo=1&bar&baz=3") #=> [["foo", "1"], ["bar", ""], ["baz", "3"]]
      
      







RbConfig :: SIZEOF


рдирдИ RbConfig :: SIZEOF рд╡рд┐рдзрд┐ C рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддреА рд╣реИред



 require "rbconfig/sizeof" RbConfig::SIZEOF["short"] #=> 2 RbConfig::SIZEOF["int"] #=> 4 RbConfig::SIZEOF["long"] #=> 8
      
      







Syslog рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рд╢реНрд░реЗрдгреА рдХреА рд╕реНрдерд╛рдкрдирд╛ :: рд▓рдХрдбрд╝рд╣рд╛рд░рд╛


Syslog :: рд▓рдХрдбрд╝рд╣рд╛рд░рд╛, Syslog рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд░-рд╕рдВрдЧрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред



 require "syslog/logger" facility = Syslog::LOG_LOCAL0 logger = Syslog::Logger.new("MyApp", facility) logger.debug("test")
      
      







CSV.for рдмрд┐рдирд╛ рдмреНрд▓реЙрдХ рдХреЗ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ


CSV.foreach, рдЬрд┐рд╕реЗ рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ IOError рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рдерд╛ред



 require "csv" enum = CSV.foreach("example.csv") enum.next #=> ["1", "foo"] enum.next #=> ["2", "bar"] enum.next #=> ["3", "baz"]
      
      







Openssl bignum


OpenSSL :: BN.new рдЕрдм рди рдХреЗрд╡рд▓ рддрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рднреА рдмрдирд╛рддрд╛ рд╣реИред



 require "openssl" OpenSSL::BN.new(4_611_686_018_427_387_904) #=> #<OpenSSL::BN:0x007fce7a0c56e8>
      
      







рдЖрдХрд╛рд░ Enumerator.new рддрд░реНрдХ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред


Enumerator.new рдЖрдХрд╛рд░ рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдпрд╛ рддреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдпрд╛ #call рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, 2.0.0 рд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рдкреНрд░реЛрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рдереАред рдЕрдм рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред



 require "thread" queue = Queue.new enum = Enumerator.new(queue.method(:size)) do |yielder| loop {yielder << queue.pop} end queue << "foo" enum.size #=> 1
      
      







рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛


рд╢рд╛рдк рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдПрдХ рд░рддреНрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред



TSort рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЗ


TSort рдХреНрд▓рд╛рд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕реВрдЪреА рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдкрд░реЗрд╢рд╛рдиреА рднрд░рд╛ рд╣реИ, рдХреБрд▓ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ TSort, рд╕рд╛рде рд╣реА #tsort_each_node рдФрд░ #tsort_each_child рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред



рд▓реЗрдХрд┐рди рдЕрдм TSort, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдм рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рджреЛ рдХрд╣рд▓рд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдХреЛ #tsort_each_node рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░реА #tsort_each_child рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВред



 require "tsort" camping_steps = { "sleep" => ["food", "tent"], "tent" => ["camping site", "canvas"], "canvas" => ["tent poles"], "tent poles" => ["camping site"], "food" => ["fish", "fire"], "fire" => ["firewood", "matches", "camping site"], "fish" => ["stream", "fishing rod"] } all_nodes = camping_steps.to_a.flatten each_node = all_nodes.method(:each) each_child = -> step, &b {camping_steps.fetch(step, []).each(&b)} puts TSort.tsort(each_node, each_child)
      
      





рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛:



 stream fishing rod fish firewood matches camping site fire food tent poles canvas tent sleep
      
      







рдЯреАрд╕реАрдкреА рдлрд╛рд╕реНрдЯ рдУрдкрди


рд░реВрдмреА 2.1 рдЯреАрд╕реАрдкреА рдлрд╛рд╕реНрдЯ рдУрдкрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЙрдХреЗрдЯ :: TCP_FASTOPEN рдФрд░ рд╕реЙрдХреЗрдЯ :: MSG_FASTOPEN рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рд╕рд░реНрд╡рд░:



 require "socket" unless Socket.const_defined?(:TCP_FASTOPEN) abort "TCP Fast Open not supported on this system" end server = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM) server.setsockopt(Socket::SOL_TCP, Socket::TCP_FASTOPEN, 5) addrinfo = Addrinfo.new(Socket.sockaddr_in(3000, "localhost")) server.bind(addrinfo) server.listen(1) socket = server.accept socket.write(socket.readline)
      
      





рдЧреНрд░рд╛рд╣рдХ:



 require "socket" unless Socket.const_defined?(:MSG_FASTOPEN) abort "TCP Fast Open not supported on this system" end socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM) socket.send("foo\n", Socket::MSG_FASTOPEN, Socket.sockaddr_in(3000, "localhost")) puts socket.readline socket.close
      
      





рднрд╛рдЧ рдПрдХ рднрд╛рдЧ рджреЛ



All Articles