درس 12: ماژولهایی که دوباره به کار میبرید
تابعهایی را که در چند اسکریپت به کار میبرید به یک ماژول ببرید، آن را در اسکریپتهای من ذخیره کنید و با نام و نسخهاش در اسکریپتهای دیگرتان وارد کنید.
درس 12 از 18. وقتی یک تابع در سه اسکریپت شما تکرار میشود، هر اصلاح را باید سه بار انجام داد. ماژول آن را در یک جا نگه میدارد: اسکریپتی از خودتان است که چیزی رسم نمیکند و فقط تابعها و نوعهایی را در اختیار اسکریپتهای دیگرتان میگذارد.
از یک تابع در خود اسکریپت شروع کنید#
اول تابع را در همان اسکریپتی بنویسید که به آن نیاز دارد و مطمئن شوید درست کار میکند:
indicator "Range in percent"
edition = 1
display = pane
fn range_percent(top: float, bottom: float): float = 100 * (top - bottom) / bottom
plot(range_percent(high, low), name = "Bar range %", style = columns, color = color.teal)
plot(tech.sma(range_percent(high, low), 20), name = "Average", color = color.orange)fn name(parameters): type = expression یک تابع اعلام میکند (درس 6 تابعها را یاد میدهد). وقتی تابعی کار کرد و آن را در اسکریپتهای دیگر هم خواستید، آن را به یک ماژول ببرید.
ماژول را بنویسید#
ماژول به جای indicator "Name" با module Name شروع میشود. فقط چیزی که با export علامت خورده باشد در اختیار اسکریپتهای دیگر است؛ بقیه مال خود ماژول میماند. این ماژول یک میانگین جاری را در یک رکورد (نوعی با چند فیلد) نگه میدارد و دو متد روی آن ارائه میکند:
// A module: a running mean kept in a record. Other scripts import it by name and version.
module Stats
edition = 1
export type Stats
n: int = 0
total: float = 0
export fn Stats.add(self: Stats, x: float)
self.n += 1
self.total += x
export fn Stats.mean(self: Stats): float = if self.n > 0 then self.total / self.n else naبرای نگه داشتن آن:
- ویرایشگر را باز کنید، اسکریپت جدید را بزنید و متن نمونه را با ماژول عوض کنید.
- ذخیره را بزنید. وقتی ماژول کامپایل شود، وضعیت کنار نامش کتابخانه — آمادهٔ ایمپورت است.
- ماژول چیزی رسم نمیکند، پس چیزی برای افزودن به نمودار ندارد. مثل بقیهٔ اسکریپتهایتان در اسکریپتهای من میماند و در تعداد اسکریپتهایی که پلن شما نگه میدارد حساب میشود.
اسکریپتهای دیگر ماژول را با نامی پیدا میکنند که بعد از module نوشته شده (اینجا Stats)، نه با نامی که در فهرست با آن ذخیره شده است، و بزرگی و کوچکی حروف مهم نیست.
واردش کنید#
// Using the module: the running mean of every close so far, drawn next to the close.
indicator "Running mean"
edition = 1
display = price
import Me/Stats@1 as mu
state stats = mu.Stats(n = 0)
stats.add(close)
plot(stats.mean(), name = "Mean of every close so far", color = color.orange)
plot(close, name = "Close", color = color.gray)import Me/Stats@1 as muماژول را وارد میکند.Meمیگوید ماژول مال خودتان است؛ در این نسخه فقط ماژولهای خودتان را میشود وارد کرد.@1نسخه است و نوشتنش لازم است.muنام کوتاهی است که برای چیزهایی که ماژول ارائه میکند به کار میبرید.mu.Stats(n = 0)یک رکورد از نوعِ ماژول میسازد؛stateآن را از کندلی به کندل بعد نگه میدارد.stats.add(close)وstats.mean()متدهای ماژول را صدا میزنند.- هر اسکریپتی که ماژولی را وارد کند حافظهٔ خودش را دارد: دو اسکریپتی که از
Statsاستفاده میکنند میانگینهای جاریشان را با هم شریک نیستند.
نسخه را نمیشود ننوشت:
indicator "An import with no version"
edition = 1
import Me/Stats as mu
plot(close)نامی که ماژول ارائه نمیکند E3172 است، و ماژولی که خودش را وارد کند، مستقیم یا از راه ماژولهای دیگر، E-IMPORT-CYCLE است. ماژولی که ندارید خطایی میدهد که نامش را میبرد. صفحهٔ ماژولها و کتابخانهها همهٔ قاعدهها و سقفها را دارد.
امتحان کنید#
- یک متد سوم به ماژول اضافه کنید،
export fn Stats.count(self: Stats): int = self.n، ذخیره کنید وstats.count()را از اسکریپت واردکننده رسم کنید. - واژهٔ
exportرا از جلویfn Stats.meanبردارید و ماژول را ذخیره کنید. حالا اسکریپت واردکننده یک مشکل نشان میدهد، چونmeanدیگر ارائه نمیشود. @1را حذف کنید (import Me/Stats as mu) و خطا را بخوانید.range_percentرا از برنامهٔ اول به ماژولی از خودتان به نامRangesببرید و باimport Me/Ranges@1 as rواردش کنید.
نقطهٔ بررسی#
- میتوانید با
module Nameیک ماژول بنویسید و آنچه ارائه میکند را باexportعلامت بزنید. - میتوانید آن را ذخیره کنید و کتابخانه — آمادهٔ ایمپورت را بشناسید.
- میتوانید آن را با
import Me/Name@1 as aliasوارد کنید و آنچه ارائه میکند را صدا بزنید. - میدانید ماژول با نامِ بعد از
moduleپیدا میشود و فقط ماژولهای خودتان را میشود وارد کرد.