واجهات سهلة مع Zig 0.10.0

صورة الغلاف لـ Easy Interfaces مع Zig 0.10.0

يقدم هذا الإصدار من Zig ميزة لغة جديدة تجعل إنشاء أنواع واجهة أكثر سهولة في الاستخدام. حول واجهات

لا يحتوي Zig على نوع واجهة مضمن ، على عكس لغات المستوى الأعلى. أحد أسباب هذا الاختيار هو حقيقة أن الأشخاص الذين يستخدمون الواجهات في معظم الأوقات يهتمون بنمذجة البرنامج بالطريقة التي يحبونها ، لكنهم عادةً لا يهتمون كثيرًا بكيفية عمل النظام خلف الكواليس.

في Zig ، نهتم دائمًا بما تقوم به الآلة ، وعندما يتعلق الأمر بالواجهات ، هناك العديد من الأساليب ذات المقايضات المختلفة ، كل منها صالح بالتساوي مع حالات الاستخدام المفضلة الخاصة به. واجهات على أساس النقابات الموسومة

تتمثل أسهل طريقة لإنشاء نوع واجهة في إنشاء اتحاد مسمى لعمليات التنفيذ الملموسة المحتملة فيه. إنه ليس الخيار الصحيح في جميع الحالات ، ولكنه عادةً ما يكون جيدًا بما يكفي للبرامج البسيطة.

لنفترض أن لدينا قطة وكلبًا ونريد أن نتمكن من استخدامهما من خلال واجهة مشتركة. قطة كونست = هيكل { pub fn talk () فارغة { std.debug.print ("مواء!"،. {}) ؛ } } ؛ كونست الكلب = هيكل { pub fn talk () فارغة { std.debug.print ("bark!"،. {}) ؛ } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة

من قبل ، كان عليك القيام بذلك في Zig:

const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { .cat => | قطة | chat.talk () ، .dog => | كلب | dog.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة

كما ترى ، فإن النقطة التي يتصل فيها الإرسال الثابت بالإرسال الديناميكي يتم تمييزها صراحةً في تنفيذ Animal.talk. في هذه الوظيفة (التي يمكن إرسالها بشكل ثابت عند استدعائها في مثيل Animal) ، يمكنك أن ترى كيف أن تنشيط الحالة النشطة يستدعي التنفيذ الصحيح ، اعتمادًا على قيمة العلامة (المعروفة عند التنفيذ ، وبالتالي ديناميكية).

هذا رائع ، لكن له جانب سلبي يتمثل في الإسهاب قليلاً. تخيل واجهة بها 100 نوع ملموس و 10 طرق كجزء من الواجهة. هذا كثير من التكرار!

لحسن الحظ ، بدءًا من Zig 0.10.0 ، يمكنك القيام بذلك: const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { مضمنة أخرى => | حالة | case.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة

ما يحدث هنا هو أن سلوك آخر مضمن داخل مفتاح تبديل يتصرف كما هو مضمن لـ أو مضمن أثناء.

في الحلقة المضمنة ، يتم فك الحلقة نفسها في الوقت المناسب واستبدالها بالنتيجة ، على النحو التالي: أرقام const = [_] usize {1، 2، 3} ؛ تراكم var: usize = 0 ؛ على الإنترنت لـ (أرقام) | n | { ...

واجهات سهلة مع Zig 0.10.0
صورة الغلاف لـ Easy Interfaces مع Zig 0.10.0

يقدم هذا الإصدار من Zig ميزة لغة جديدة تجعل إنشاء أنواع واجهة أكثر سهولة في الاستخدام. حول واجهات

لا يحتوي Zig على نوع واجهة مضمن ، على عكس لغات المستوى الأعلى. أحد أسباب هذا الاختيار هو حقيقة أن الأشخاص الذين يستخدمون الواجهات في معظم الأوقات يهتمون بنمذجة البرنامج بالطريقة التي يحبونها ، لكنهم عادةً لا يهتمون كثيرًا بكيفية عمل النظام خلف الكواليس.

في Zig ، نهتم دائمًا بما تقوم به الآلة ، وعندما يتعلق الأمر بالواجهات ، هناك العديد من الأساليب ذات المقايضات المختلفة ، كل منها صالح بالتساوي مع حالات الاستخدام المفضلة الخاصة به. واجهات على أساس النقابات الموسومة

تتمثل أسهل طريقة لإنشاء نوع واجهة في إنشاء اتحاد مسمى لعمليات التنفيذ الملموسة المحتملة فيه. إنه ليس الخيار الصحيح في جميع الحالات ، ولكنه عادةً ما يكون جيدًا بما يكفي للبرامج البسيطة.

لنفترض أن لدينا قطة وكلبًا ونريد أن نتمكن من استخدامهما من خلال واجهة مشتركة. قطة كونست = هيكل { pub fn talk () فارغة { std.debug.print ("مواء!"،. {}) ؛ } } ؛ كونست الكلب = هيكل { pub fn talk () فارغة { std.debug.print ("bark!"،. {}) ؛ } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة

من قبل ، كان عليك القيام بذلك في Zig:

const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { .cat => | قطة | chat.talk () ، .dog => | كلب | dog.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة

كما ترى ، فإن النقطة التي يتصل فيها الإرسال الثابت بالإرسال الديناميكي يتم تمييزها صراحةً في تنفيذ Animal.talk. في هذه الوظيفة (التي يمكن إرسالها بشكل ثابت عند استدعائها في مثيل Animal) ، يمكنك أن ترى كيف أن تنشيط الحالة النشطة يستدعي التنفيذ الصحيح ، اعتمادًا على قيمة العلامة (المعروفة عند التنفيذ ، وبالتالي ديناميكية).

هذا رائع ، لكن له جانب سلبي يتمثل في الإسهاب قليلاً. تخيل واجهة بها 100 نوع ملموس و 10 طرق كجزء من الواجهة. هذا كثير من التكرار!

لحسن الحظ ، بدءًا من Zig 0.10.0 ، يمكنك القيام بذلك: const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { مضمنة أخرى => | حالة | case.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة

ما يحدث هنا هو أن سلوك آخر مضمن داخل مفتاح تبديل يتصرف كما هو مضمن لـ أو مضمن أثناء.

في الحلقة المضمنة ، يتم فك الحلقة نفسها في الوقت المناسب واستبدالها بالنتيجة ، على النحو التالي: أرقام const = [_] usize {1، 2، 3} ؛ تراكم var: usize = 0 ؛ على الإنترنت لـ (أرقام) | n | { ...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow