객체의 딥 클론
2224 단어 대상
class Object
def dclone
case self
when Fixnum, Bignum, Float, NilClass, FalseClass, TrueClass, Continuation
klone = self
when Hash
klone = self.clone
self.each{|k, v| klone[k] = v.dclone}
when Array
klone = self.clone
klone.clear
self.each{|v| klone << v.dclone}
else
klone = self.clone
end
klone.instance_variables.each {|v|
klone.instance_variable_set(v,
klone.instance_variable_get(v).dclone)
}
klone
end
end
실현
class Object
def deep_clone
_deep_clone({})
end
protected
def _deep_clone(cloning_map)
return cloning_map[self] if cloning_map.key? self
cloning_obj = clone
cloning_map[self] = cloning_obj
cloning_obj.instance_variables.each do |var|
val = cloning_obj.instance_variable_get(var)
begin
val = val._deep_clone(cloning_map)
rescue TypeError
next
end
cloning_obj.instance_variable_set(var, val)
end
cloning_obj
end
end
class Array
protected
def _deep_clone(cloning_map)
return cloning_map[self] if cloning_map.key? self
cloning_obj = super
cloning_obj.map! do |val|
begin
val = val._deep_clone(cloning_map)
rescue TypeError
end
val
end
cloning_obj
end
end
class Hash
protected
def _deep_clone(cloning_map)
return cloning_map[self] if cloning_map.key? self
cloning_obj = super
pairs = cloning_obj.to_a
cloning_obj.clear
pairs.each do |pair|
pair.map! do |val|
begin
val = val._deep_clone(cloning_map)
rescue TypeError
end
val
end
cloning_obj[pair[0]] = pair[1]
end
cloning_obj
end
end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
List 컬렉션 객체에서 서로 다른 속성 크기로 정렬된 인스턴스인스턴스는 다음과 같습니다. 테스트: 출력 결과는 다음과 같습니다. 두 번째 방법은 컬렉션에 따라.sort 재부팅 방법(예: 마스터 클래스에서 이렇게 작성하면 됩니다. 출력 결과는 다음과 같습니다. 전자의 코드 구조...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.