diff options
author | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-08-06 10:13:34 +0000 |
---|---|---|
committer | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-08-06 10:13:34 +0000 |
commit | 3766aa4cc574d9d5d49af7a126c8a2f2876b5ad2 (patch) | |
tree | ee9603666869cd3606420090dc24b9dee301b5e0 | |
parent | 4d5fceb08681e77570dd66f7fbc483ec853a2d47 (diff) | |
download | ruby-3766aa4cc574d9d5d49af7a126c8a2f2876b5ad2.tar.gz |
Implement Set#clone. [Fixes GH-661]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | lib/set.rb | 11 | ||||
-rw-r--r-- | test/test_set.rb | 22 |
3 files changed, 38 insertions, 2 deletions
@@ -1,3 +1,10 @@ +Wed Aug 6 19:09:27 2014 Akinori MUSHA <knu@iDaemons.org> + + * lib/set.rb (Set): Implement Set#clone by splitting + initialize_copy into initialize_dup and initialize_clone. + Submitted by yui-knk. [Fixes GH-661] + https://github.com/ruby/ruby/pull/661 + Wed Aug 6 18:42:58 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp> * ext/win32ole/win32ole.c: separate src of WIN32OLERuntimeError diff --git a/lib/set.rb b/lib/set.rb index 0d9870ccd7..db57594d0a 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -100,11 +100,18 @@ class Set end private :do_with_enum - # Copy internal hash. - def initialize_copy(orig) + # Dup internal hash. + def initialize_dup(orig) + super @hash = orig.instance_variable_get(:@hash).dup end + # Clone internal hash. + def initialize_clone(orig) + super + @hash = orig.instance_variable_get(:@hash).clone + end + def freeze # :nodoc: @hash.freeze super diff --git a/test/test_set.rb b/test/test_set.rb index 559bc12897..169136f0d9 100644 --- a/test/test_set.rb +++ b/test/test_set.rb @@ -585,6 +585,28 @@ class TC_Set < Test::Unit::TestCase assert_equal 4, set.size end + def test_freeze_dup + set1 = Set[1,2,3] + set1.freeze + set2 = set1.dup + + assert_not_predicate set2, :frozen? + assert_nothing_raised { + set2.add 4 + } + end + + def test_freeze_clone + set1 = Set[1,2,3] + set1.freeze + set2 = set1.clone + + assert_predicate set2, :frozen? + assert_raise(RuntimeError) { + set2.add 5 + } + end + def test_inspect set1 = Set[1] |