ومهام ناقلات نسخ من حيث القيمة أو بالرجوع باللغة العودة غوغل؟
سؤال
في التعليمة البرمجية التالية، وإنشاء واحد لغز الربط ثم نفذ خطوة على ذلك وهو ما يضيف خطوة لناقلات movesAlreadyDone لها. ثم أنا خلق لغز ربط آخر ثم القيام خطوة على ذلك وهو ما يضيف خطوة لناقلات movesAlreadyDone لها. عند طباعة من القيم في هذا متجه لثانية واحدة، فمن لديه تحرك فيه من أول واحد جنبا إلى جنب مع هذه الخطوة من ثانية واحدة. يمكن لأحد أن يقول لي لماذا يبدو أن تعيين بالرجوع ولا قيمة؟ ومهام ناقلات نسخ من حيث القيمة أو بالرجوع باللغة العودة غوغل؟
package main
import "fmt"
import "container/vector"
type Move struct { x0, y0, x1, y1 int }
type PegPuzzle struct {
movesAlreadyDone * vector.Vector;
}
func (p *PegPuzzle) InitPegPuzzle(){
p.movesAlreadyDone = vector.New(0);
}
func NewChildPegPuzzle(parent *PegPuzzle) *PegPuzzle{
retVal := new(PegPuzzle);
retVal.movesAlreadyDone = parent.movesAlreadyDone;
return retVal
}
func (p *PegPuzzle) doMove(move Move){
p.movesAlreadyDone.Push(move);
}
func (p *PegPuzzle) printPuzzleInfo(){
fmt.Printf("-----------START----------------------\n");
fmt.Printf("moves already done: %v\n", p.movesAlreadyDone);
fmt.Printf("------------END-----------------------\n");
}
func main() {
p := new(PegPuzzle);
cp1 := new(PegPuzzle);
cp2 := new(PegPuzzle);
p.InitPegPuzzle();
cp1 = NewChildPegPuzzle(p);
cp1.doMove(Move{1,1,2,3});
cp1.printPuzzleInfo();
cp2 = NewChildPegPuzzle(p);
cp2.doMove(Move{3,2,5,1});
cp2.printPuzzleInfo();
}
وسيتم تقدير كبير أي مساعدة. شكرا!
المحلول
وعرضية إلى الإجابة، ولكن قد تم حذفه vector.New
من الإصدارات الأخيرة من العودة. تحتاج إلى كتابة
func (p *PegPuzzle) InitPegPuzzle(){
p.movesAlreadyDone = new (vector.Vector);
}
في التعليمات البرمجية الأصلية الخاصة بك، والأشياء التي تقوم بنسخ هي مؤشرات إلى ناقلات. هذه ليست سوى نفس المؤشرات في C. يمكنك تسميتها "حسب المرجع" إذا أردت، لكنهم المؤشرات.
لنسخ ناقلات بالكامل، استخدم InsertVector
:
func (p *PegPuzzle) InitPegPuzzle(){
p.movesAlreadyDone = new (vector.Vector);
}
func NewChildPegPuzzle(parent *PegPuzzle) *PegPuzzle{
retVal := new (PegPuzzle);
retVal.InitPegPuzzle ();
retVal.movesAlreadyDone.InsertVector (0, parent.movesAlreadyDone);
return retVal
}
وهذا يعطي نسخة فريدة كاملة.
نصائح أخرى
في التعليمات البرمجية، movesAlreadyDone
هو *vector.Vector
. عند تعيين retVal.movesAlreadyDone = parent.movesAlreadyDone;
، تقوم بنسخ مرجعا. في أي وقت يتم تعديل ناقلات على أي retVal.movesAlreadyDone
أو parent.movesAlreadyDone
عليك أن تكون تعديل نفس ناقل الأساسي.
إذا كنت تريد نسخ محتويات متجه إلى أخرى ستحتاج إلى تكرار خلال ناقلات المصدر ودفع عناصرها إلى ناقلات الوجهة. مثل ذلك:
for n := range srcVect.Iter() {
dstVect.Push(n);
}