Implement Set#clone. [Fixes GH-661]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
knu 2014-08-06 10:13:34 +00:00
Родитель 4d5fceb086
Коммит 3766aa4cc5
3 изменённых файлов: 38 добавлений и 2 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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

Просмотреть файл

@ -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]