From 09b1e46e714f1d426b6590db2da7cdd88388b676 Mon Sep 17 00:00:00 2001 From: TORIFUKU Kaiou Date: Mon, 21 Sep 2015 19:57:51 +0900 Subject: [PATCH] lib/set.rb: use *args of Enumerable#to_set, Set#to_set. --- lib/set.rb | 8 ++++++-- test/test_set.rb | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/lib/set.rb b/lib/set.rb index d612fdc..d8120d5 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -169,7 +169,7 @@ class Set # overridden. def to_set(klass = Set, *args, &block) return self if instance_of?(Set) && klass == Set && block.nil? && args.empty? - klass.new(self, *args, &block) + super end def flatten_merge(set, seen = Set.new) # :nodoc: @@ -693,7 +693,11 @@ module Enumerable # Makes a set from the enumerable object with given arguments. # Needs to +require "set"+ to use this method. def to_set(klass = Set, *args, &block) - klass.new(self, *args, &block) + if respond_to?(:<<) + klass.new(args.inject(dup) { |result, item| result << item }, &block) + else + args.inject(klass.new(self, &block)) { |result, item| result << (block ? block[item] : item) } + end end end diff --git a/test/test_set.rb b/test/test_set.rb index 854bcc6..595a86b 100644 --- a/test/test_set.rb +++ b/test/test_set.rb @@ -720,5 +720,45 @@ class TC_Enumerable < Test::Unit::TestCase set = ary.to_set(SortedSet) { |o| o * -2 } assert_instance_of(SortedSet, set) assert_equal([-10,-8,-6,-4,-2], set.sort) + + set = ary.to_set(Set, 6, 7, 8) + assert_instance_of(Set, set) + assert_equal([1,2,3,4,5,6,7,8], set.sort) + + set = ary.to_set(Set, 6, 7, 8) { |o| o * -2 } + assert_instance_of(Set, set) + assert_equal([-16,-14,-12,-10,-8,-6,-4,-2], set.sort) + + set = ary.to_set + sorted_set = set.to_set(SortedSet, 6, -1, 4.3) + assert_instance_of(Set, set) + assert_instance_of(SortedSet, sorted_set) + assert_equal([1,2,3,4,5], set.sort) + assert_equal([-1,1,2,3,4,4.3,5,6], sorted_set.to_a) + set = sorted_set.to_set { |o| o * 2 } + assert_instance_of(Set, set) + assert_equal([-2,2,4,6,8,8.6,10,12], set.sort) + sorted_set = sorted_set.to_set(SortedSet, -1, -2) { |o| o * 2 } + assert_instance_of(SortedSet, sorted_set) + assert_equal([-4,-2,2,4,6,8,8.6,10,12], sorted_set.to_a) + + hash = { 1 => 'Oh', 3 => 'Nagashima' } + set = hash.to_set + assert_equal(true, set.include?([1,'Oh'])) + assert_equal(true, set.include?([3,'Nagashima'])) + + args = { 4 => 'Kurosawa', 14 => 'Sawamura', 16 => 'Kawakami' , 34 => 'Kaneda' } + set = hash.to_set(Set, *args) + assert_instance_of(Set, set) + assert_equal(true, set.include?([1,'Oh'])) + assert_equal(true, set.include?([3,'Nagashima'])) + assert_equal(true, set.include?([4,'Kurosawa'])) + assert_equal(true, set.include?([14, 'Sawamura'])) + assert_equal(true, set.include?([16, 'Kawakami'])) + assert_equal(true, set.include?([34, 'Kaneda'])) + + set = hash.to_set(SortedSet, *args) { |o| o.last } + assert_instance_of(SortedSet, set) + assert_equal(['Kaneda','Kawakami','Kurosawa','Nagashima','Oh','Sawamura'], set.to_a) end end -- 2.5.3