ومهام ناقلات نسخ من حيث القيمة أو بالرجوع باللغة العودة غوغل؟

StackOverflow https://stackoverflow.com/questions/1806673

  •  05-07-2019
  •  | 
  •  

سؤال

في التعليمة البرمجية التالية، وإنشاء واحد لغز الربط ثم نفذ خطوة على ذلك وهو ما يضيف خطوة لناقلات 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top