Skip to main content

መዋቅር

አጠቃላይ እይታ

በWave ቋንቋ ውስጥ ያሉ አወቃቀሮች በተጠቃሚ የተገለጹ የውሂብ አይነቶችን ለማወጅ ቁልፍ የአገባብ አካላት ናቸው። አወቃቀሮች የተለያዩ አይነት እሴቶችን ወደ አንድ አመክንዮአዊ ክፍል በመመደብ ግልጽ እና ደህንነቱ በተጠበቀ መልኩ ውስብስብ የውሂብ አወቃቀሮችን እንዲቀርጹ ያስችሉዎታል።

የWave መዋቅር እንደ እሴት አይነት ይሰራል። ሁሉም መስኮች ግልጽ ዓይነት ሊኖራቸው ይገባል፣ እና የመዋቅር ምሳሌ ሲፈጥሩ ሁሉም መስኮች መጀመር አለባቸው። እነዚህ ደንቦች የአወቃቀሩ ሁኔታ ሁልጊዜ የተሟላ እና ሊተነበይ የሚችል መሆኑን ያረጋግጣሉ.

የመዋቅር መግለጫ አገባብ

struct ቁልፍ ቃል በመጠቀም መዋቅሮች ይታወቃሉ። የአወቃቀሩ ስም ፓስካልኬዝ ይጠቀማል, እና አንድ ወይም ከዚያ በላይ መስኮች በመዋቅሩ አካል ውስጥ ሊገለጹ ይችላሉ.

መስኮች በname: type; ቅርጸት ይታወቃሉ እና ከእያንዳንዱ የመስክ መግለጫ በኋላ ሴሚኮሎን ያስፈልጋል።

struct Box {
size: i32;
weight: f32;
}

አወቃቀሩን ሲያውጅ, መስኮች የተፈጠሩበት ቅደም ተከተል እንደ ማህደረ ትውስታ አቀማመጥ ቅደም ተከተል ጥቅም ላይ ይውላል. በአንድ መዋቅር ውስጥ የመስክ መግለጫዎች ብቻ ይፈቀዳሉ; ተግባራትን ወይም ዘዴዎችን ማካተት አይቻልም. የድርጊት አመክንዮው ከመዋቅሩ ውጭ በተናጠል ይገለጻል.

መዋቅር መፍጠር አገባብ

አወቃቀሮችን በመዋቅር ስም በመጠቀም በጥሬው መልክ የተፈጠሩ ናቸው። የመዋቅር ቃል በቃል የተፃፉት በStructName { field_name: value; ... } መልክ ነው።

var b: Box = Box {
size: 42;
weight: 10.5;
};

መዋቅርን በሚፈጥሩበት ጊዜ, ሁሉም የተገለጹ መስኮች መጀመር አለባቸው. አንዱ ከጠፋ፣ የማጠናቀር ስህተት ይከሰታል።

በመነሻ ጊዜ የመስኮች አፈጣጠር ቅደም ተከተል ከመዋቅር መግለጫ ቅደም ተከተል ጋር መዛመድ የለበትም ፣ ግን በእያንዳንዱ መስክ ላይ የተላለፈው የእሴት አይነት በአወቃቀሩ ውስጥ ከተገለጸው አይነት ጋር በትክክል መዛመድ አለበት። Wave በመዋቅር መስክ ጅምር ጊዜ ስውር አይነት መለወጥን አይፈቅድም።


የመስክ መዳረሻ አገባብ መዋቅር

የአንድ መዋቅር መስኮች የነጥብ ኖት በመጠቀም ይደርሳሉ። የመስክ መዳረሻ ለንባብም ሆነ ለመጻፍ ተመሳሳይ አገባብ ይጠቀማል።

println("Size: {}", b.size);
println("Weight: {}", b.weight);

የሌለ የመስክ ስም ለመጠቀም ከሞከሩ፣ በማጠናቀር ደረጃ ላይ ስህተት ይከሰታል። አወቃቀሩ የእሴት አይነት ስለሆነ ሙሉውን መዋቅር ሲመደብ ወይም እንደ የተግባር ነጋሪ እሴት ሲያልፍ፣ በመዋቅሩ ውስጥ ያሉት ሁሉም መስኮች በአንድ ላይ ይገለበጣሉ.


የመዋቅር ዘዴ ፍቺ አገባብ

የWave ቋንቋ በህንፃዎች ውስጥ ቀጥተኛ ዘዴዎችን አይገልጽም። በምትኩ፣ ከመዋቅሩ ጋር የተያያዙ ዘዴዎችን ለማወጅ የproto ቁልፍ ቃሉን ተጠቀም።

proto ብሎክ የአንድ የተወሰነ መዋቅር ንብረት የሆኑ ተግባራት አካባቢ ነው፣ በዚህ እገዳ ውስጥ የተገለጹ ተግባራት እንደ ተጓዳኝ መዋቅር ዘዴዎች ጥቅም ላይ ይውላሉ.

ዘዴው እንደ መጀመሪያው መለኪያ ከ self ጋር የመዋቅር ምሳሌ ተላልፏል። self አጠቃላይ መዋቅሩን የሚያመለክት ሲሆን እሴቱን በመገልበጥ ይተላለፋል።

proto Box {
fun print(self) {
println("size={}, weight={}", self.size, self.weight);
}

fun added_size(self, x: i32) -> i32 {
return self.size + x;
}
}

proto ብሎክ እንደ መዋቅራዊ መግለጫው በተመሳሳይ ፋይል ውስጥ መቀመጥ አያስፈልገውም። በርካታ የproto ብሎኮች ለተመሳሳይ መዋቅር የተከፋፈሉ ዘዴዎችን ፍቺ ይፈቅዳሉ።

የስልት ጥሪዎች የነጥብ ኖተሽን ይጠቀማሉ እና እንደ መደበኛ ተግባር ጥሪዎች ተመሳሳይ ባህሪ ያሳያሉ።

b.print();
var n: i32 = b.added_size(5);

አወቃቀሮችን እንደ ተግባር ነጋሪ እሴት መጠቀም

አወቃቀሮች እንደ ክርክሮች ወደ ተግባራት ሲተላለፉ, እንደ ቅጅ-በ-ዋጋ ዘዴዎች ይወሰዳሉ. በአንድ ተግባር ውስጥ ያሉትን የመዋቅር መስኮችን ቢያሻሽሉም በጠሪው ላይ ያለውን የመዋቅር ምሳሌ አይነካም።

fun calc(box: Box) -> i32 {
return box.size * 2;
}

ተመሳሳይ እሴት መቅዳት የሚከሰተው መዋቅር የአንድ ተግባር መመለሻ እሴት ሆኖ ጥቅም ላይ ሲውል ነው። ይህ ባህሪ መዋቅሩ የማይለወጥ እና ሊገመት የሚችል የውሂብ ፍሰት ያረጋግጣል።


የተከተተ መዋቅር

በWave ውስጥ፣ ሌሎች መዋቅሮችን እንደ መዋቅሩ የመስክ አይነት መጠቀም ይችላሉ። አወቃቀሮች የተሟሉ ዓይነቶች በመሆናቸው በሌሎች መዋቅሮች ውስጥ በነፃነት ሊቀመጡ ይችላሉ.

struct Position {
x: i32;
y: i32;
}

struct Player {
name: str;
pos: Position;
}

የተከታታይ የነጥብ ኖት በመጠቀም የጎጆ መዋቅሮች መስኮች ይደርሳሉ።

var p: Player = Player {
name: "Alice";
pos: Position { x: 10; y: 20; };
};

println("Player X: {}", p.pos.x);
println("Player Y: {}", p.pos.y);

በጥሬው መዋቅር ውስጥ በመክተት ሌላ መዋቅር መፃፍ ይችላሉ። በዚህ ሁኔታ, ሁሉም የመስክ አጀማመር ደንቦች በእኩልነት ይተገበራሉ.


መዋቅሮች ድርድር

አወቃቀሮችን በድርድር ውስጥ እንደ ኤለመንት ዓይነቶች መጠቀም ይቻላል። የ Wave ድርድር አገባብ የarray<type, length> ቅርጸትን ይጠቀማል፣ እና የአወቃቀሩ አይነት እንዲሁ ሊገለጽ ይችላል።

var players: array<Player, 3> = [
Player { name: "A"; pos: Position { x: 1; y: 2; }; },
Player { name: "B"; pos: Position { x: 3; y: 4; }; },
Player { name: "C"; pos: Position { x: 5; y: 6; }; }
];

የመዋቅር ድርድር ክፍሎችን ሲደርሱ መጀመሪያ የድርድር መረጃ ጠቋሚውን ይጠቀሙ፣ ከዚያ የነጥብ ኖት በመጠቀም በአንድ መዋቅር ውስጥ መስኮችን ያገኛሉ።

println("Second Player X: {}", players[1].pos.x);

በመዋቅሮች ላይ መሰረታዊ ስራዎች ይቻል እንደሆነ

የWave መዋቅር በተጠቃሚ የተገለጸ አይነት ስለሆነ፣ በሂሳብ ወይም በንፅፅር ስራዎች ውስጥ ወዲያውኑ አይሳተፍም.

የመዋቅር እኩልነት ንጽጽር፣ መደርደር፣ ሃሽንግ፣ የቁጥር ስራዎች፣ ወዘተ ከፈለጉ። ባህሪውን በproto ብሎክ በኩል በግልፅ መግለፅ አለብዎት። Wave ለመዋቅሮች ስውር ኦፕሬተሮችን አይሰጥም ፣ በመርህ ደረጃ, ሁሉም ድርጊቶች በግልጽ ተገልጸዋል.