F # 4: Let / Use / Do

في هذا المنشور ، سننظر في الروابط في F # ، وسننظر على وجه الخصوص في Let / Use / Do. الآن قد تسأل نفسك ما هي الارتباطات ، وبما أننا لم نفحصها بعد ، فقد حان الوقت للتحدث عنها.

ببساطة ، تربط الرابطة معرفًا بقيمة أو وظيفة.

سمح


يمكنك استخدام الكلمة الرئيسية واسمحوا لربط اسم مع قيمة أو وظيفة. في الواقع ، هناك استخدام مختلف دقيق للـ Let ، حيث يتم الإعلان عن أحدهما في المستوى الأعلى في الوحدة ، ثم الآخر ، حيث نحدد بعض السياق المحلي. هنا مثال على كل منهما:

module DemoModule = let someFunction = let a = 1 let b = 2 a * b 

يمكننا الوصول إلى بعض الوظائف باستخدام اسم مؤهل تمامًا ، مثل DemoModule.someFunction ، لكن روابط Let (a، b) المتداخلة متاحة فقط لـ Let level. عادةً ما ترى المزيد من الحالات عندما نستخدم "ربط ملزم" للإعلان عن بعض قيم الوحدة الداخلية ، لذلك دعونا نركز جهودنا هناك (على الرغم من أنه من المهم معرفة أنه يمكنك استخدام "السماح على مستوى الوحدة النمطية").

لذلك دعونا ننظر إلى بعض الأمثلة الأخرى.

 let aString ="this is a string" let aInt = 12 let aDecimal = 12.444 let aPiFunction () = Math.PI let aSquareRootFunction (x) = Math.Sqrt(x) let aFullyTypedSquareRootFunction (x :float) = Math.Sqrt(x) let a,b = "a","tuple" 

يمكنك أن ترى أنه يمكننا استخدام رابط الربط لربط قيم متعددة ، والتي يمكن أن تكون من أنواع مختلفة ، مثل:

  • عدد صحيح
  • رقم عشري
  • وظيفة دون معلمات الإدخال
  • تعمل مع معلمات الإدخال (حيث سيختار نظام الاستدلال المنطقي للنوع F # النوع بشكل صحيح)
  • دالة لها أنواع معلمات محددة بالكامل
  • Tuple (في هذه الحالة ، String * String tuple)

في مكان آخر ، يمكنك رؤية الرابط "تجليد" في الفصل ، لكننا سنناقش هذا بمزيد من التفصيل في المقالة التالية في هذه السلسلة.

يمكنك قراءة المزيد حول السماح الربط على MSDN.

استعمال


يشبه استخدام الربط ربط الربط ، لأنه يربط القيمة بنتيجة التعبير. يتمثل الاختلاف الرئيسي في أن استخدام الربط مصمم للعمل مع أنواع IDisposable وحذف القيمة تلقائيًا عندما لم يعد في نطاقها. هذا مشابه جدًا للكلمة الرئيسية التي تستخدم .NET. على الرغم من أنني لا أعتقد أن الربط F # Use سيكون هو نفسه تمامًا كما هو الحال في .NET ، لأن الكلمة الأساسية المستخدمة في .NET هي في الحقيقة محاولة / أخيرًا مع استدعاء للتخلص ( في النهاية.

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

 use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "This is a string line %s\r\n" "cat" fprintf sw "This is a int line %i" 10 sw.Close() 

في هذا المثال ، يضمن استخدام الربط أن طريقة StreamWriter ستستدعي الأسلوب Dispose () بعد استدعاء sw.Close () ، الموضح أعلاه.

استخدم فقط مع IDisposables ، وسوف تحصل على خطأ في الترجمة إذا حاولت استخدامه مع شيء آخر ، كما هو موضح أدناه:

صورة

نظرًا لأن طريقة التخلص () تسمى في نهاية استخدام الربط ، يجب الحرص على عدم إرجاع القيمة المرتبطة بـ Let.

 let Write = use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") sw 

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

 let Write callback = use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "Write is writing to the StreamWriter" callback sw sw let callback sw = fprintf sw "sw is the StreamWriter" let disp = Write callback 

هل


يتم استخدام الربط do لتنفيذ التعليمات البرمجية دون تحديد دالة أو قيمة. يجب أن ترجع الوحدة التجليد دائمًا (بدون قيمة / فراغ). في كثير من الحالات ، يمكنك حذف Do Do وسوف يعمل كل شيء كما هو متوقع.

فيما يلي بعض الأمثلة على استخدام Do bindings.

 do printf "doing the do" //oh oh not a unit do printf "print a sum %i" 1 + 1 do 1 + 1 

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

صورة

لديك خياران:

  • استخدم عامل خط أنابيب لتجاهل النتيجة
  • إنشاء السماح ملزم

لقد عرضت مثالاً لكل منهم أدناه:

 let x = 1 + 1 do printf "print a sum %i" x do (1+1 |> ignore) 

دعونا! استخدام! تفعل!


على الرغم من أنني لا أريد مناقشتها بعد ، فقد تشاهد أحيانًا اسمح لـ Let! استخدام! افعل ذلك ، وعند القيام بذلك ، يعد هذا جزءًا مما يسمى التعبير الحسابي. من المرجح أن ترى هذا في سير العمل غير المتزامن لـ F # ، والذي سنغطيه في إحدى المقالات النهائية. إذا فهمت ما يكفي ، فيمكنني حتى محاولة توضيح كيف يمكنك إنشاء "تعبير حسابي" خاص بك ، على الرغم من كونه مفهومًا مجرَّدًا إلى حد ما وموضوعًا معقدًا إلى حد ما ، حتى الآن ليس الوقت المناسب لهم.

Source: https://habr.com/ru/post/ar470195/


All Articles