1. 15 8月, 2018 6 次提交
    • B
      Follow up #33530 · 50ac00cb
      bogdanvlviv 提交于
      - Move changelog entry of #33530 up in order to preserve the chronology
        since we always add new entries on the top of a changelog file.
      - Clarify the changelog entry
      - Clarify the docs of remove_foreign_key
      - Ensure reversible of `remove_foreign_key` with `:primary_key` and `:to_table`
        options.
      50ac00cb
    • R
      Merge pull request #33530 from jychen7/33515-invert-remove-foreign-key · d54435b6
      Richard Schneeman 提交于
      33515 invert remove foreign key support "to_table"
      d54435b6
    • M
      Merge pull request #33137 from bogdanvlviv/add-array-extract-method · 7fa2f539
      Matthew Draper 提交于
      Add `Array#extract!`
      7fa2f539
    • B
      Refactor `Array#extract!` · b71abb3b
      bogdanvlviv 提交于
      Avoid allocating the second array by using `Array#reject!` instead of
      `Enumerable#partition` in `Array#extract!`.
      
      There are benchmarks in order to ensure that the changes speed up the method:
      ```
      begin
        require "bundler/inline"
      rescue LoadError => e
        $stderr.puts "Bundler version 1.10 or later is required. Please update
      your Bundler"
        raise e
      end
      
      class Array
        def extract_v1!(&block)
          unless block_given?
            to_enum(:extract!) { size }
          else
            extracted_elements, other_elements = partition(&block)
      
            replace(other_elements)
      
            extracted_elements
          end
        end
      
        def extract_v2!
          return to_enum(:extract!) { size } unless block_given?
      
          extracted_elements = []
      
          reject! do |element|
            extracted_elements << element if yield(element)
          end
      
          extracted_elements
        end
      end
      
      gemfile(true) do
        source "https://rubygems.org"
      
        gem "benchmark-ips"
      end
      
      arrays_for_partition = Array.new(1000) { (0..10000).to_a }
      arrays_for_extract_v1 = Array.new(1000) { (0..10000).to_a }
      arrays_for_extract_v2 = Array.new(1000) { (0..10000).to_a }
      
      Benchmark.ips do |x|
        x.report("Array#partition")  do
          arrays_for_partition.each do |numbers|
            odd_numbers, numbers = numbers.partition { |number| number.odd? }
            numbers
          end
        end
      
        x.report("Array#extract_v1!")  do
          arrays_for_extract_v1.each do |numbers|
            odd_numbers = numbers.extract_v1! { |number| number.odd? }
            numbers
          end
        end
      
        x.report("Array#extract_v2!")  do
          arrays_for_extract_v2.each do |numbers|
            odd_numbers = numbers.extract_v2! { |number| number.odd? }
            numbers
          end
        end
      
        x.compare!
      end
      ```
      
      The result of the benchmarks:
      
      ```
      ruby -v
      ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
      ```
      
      ```
      Fetching gem metadata from https://rubygems.org/.
      Resolving dependencies...
      Using benchmark-ips 2.7.2
      Using bundler 1.16.1
      Warming up --------------------------------------
           Array#partition     1.000  i/100ms
         Array#extract_v1!     1.000  i/100ms
         Array#extract_v2!     1.000  i/100ms
      Calculating -------------------------------------
           Array#partition      1.390  (± 0.0%) i/s -      7.000  in   5.044843s
         Array#extract_v1!      2.781  (± 0.0%) i/s -     14.000  in   5.050589s
         Array#extract_v2!      3.151  (± 0.0%) i/s -     16.000  in   5.080608s
      
      Comparison:
         Array#extract_v2!:        3.2 i/s
         Array#extract_v1!:        2.8 i/s - 1.13x  slower
           Array#partition:        1.4 i/s - 2.27x  slower
      ```
      
      Avoid `unless`/`else` in favour of an early return.
      The double-negative of that `else` can be confusing,
      even though the code layout is nearly the same.
      Also using of early return would improve `git diff`
      if we needed to change this method.
      b71abb3b
    • B
      Use `Array#extract!` where possible · e765bff1
      bogdanvlviv 提交于
      e765bff1
    • B
      Add `Array#extract!` · 77b01260
      bogdanvlviv 提交于
      The method removes and returns the elements for which the block returns a true value.
      If no block is given, an Enumerator is returned instead.
      
      ```
      numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
      numbers # => [0, 2, 4, 6, 8]
      ```
      77b01260
  2. 14 8月, 2018 2 次提交
  3. 13 8月, 2018 8 次提交
  4. 12 8月, 2018 9 次提交
  5. 11 8月, 2018 10 次提交
  6. 10 8月, 2018 5 次提交