// In the file program.fs. let x = 40
module Program let x = 40
module MyModule1 = let module1Value = 100 let module1Function x = x + 10 // MyModule2 module MyModule2 = let module2Value = 121 let module2Function x = x * (MyModule1.module1Function module2Value)
استفاده از یک ماژول در فایلهای دیگر.
گاهی اوقات نیاز به استفاده از تعاریف و توابع موجود در ماژولی داریم که در یک فایل دیگر قرار دارد. در این حالت باید به روش زیر عمل کنیم.
فرض بر این است ماژول زیر در یک فایل به نام ArithmeticFile قرار دارد.
module Arithmetic let add x y = x + y let sub x y = x - y
#1 روش اول (دقیقا مشابه روش قبل از نام ماژول استفاه میکنیم)
let result1 = Arithmetic.add 5 9
open Arithmetic let result2 = add 5 9
در #F میتوانیم بک ماژول را درون ماژول دیگر تعریف کنیم یا به عبارت دیگر میتوانیم ماژولی داشته باشیم که خود شامل چند تا ماژول دیگر باشد. مانند:
module Y = let x = 1 module Z = let z = 5
module Y = let x = 1 module Z = let z = 5
module Y = module Z = let z = 5
module Y = module Z = let z = 5
مفهوم فضای نام کاملا مشابه مفهوم فضای نام در #C است و راهی است برای کپسوله سازی کدها در برنامه. مفهوم namespace با مفهوم module کمی متفاوت است.
ساختار کلی
namespace [parent-namespaces.]identifier
#1 اگر قصد داشته باشید که از فضای نام در کدهای خود استفاده کنید باید اولین تعریف در source file برنامه تعریف namespace باشد.
#2 امکان تعریف شناسه یا تابع به صورت مستقیم در namespace وجود ندارد بلکه این تعاریف باید در ماژولها یا typeها نظیر تعریف کلاس قرار گیرند.
#3 امکان تعریف فضای نام با استفاده از تعاریف ماژول نیز وجود دارد( در ادامه به بررسی یک مثال در این زمینه میپردازیم)
تعریف namespace به صورت مستقیم:
namespace Model type Car = member this.Name = "BMW" module SetCarName = let CarName = "Pride"
module Model.Car module SetCarName = let CarName = "Pride"
همانند ماژولها امکان تعریف فضای نام تودرتو نیز وجود دارد. یک مثال در این زمینه:
namespace Outer type OuterMyClass() = member this.X(x) = x + 1 namespace Outer.Inner type InnerMyClass() = member this.Prop1 = "X"
Outer.Inner.InnerMyClass