millionchart
English

درس 12: ماژول‌هایی که دوباره به کار می‌برید

تابع‌هایی را که در چند اسکریپت به کار می‌برید به یک ماژول ببرید، آن را در اسکریپت‌های من ذخیره کنید و با نام و نسخه‌اش در اسکریپت‌های دیگرتان وارد کنید.

درس 12 از 18. وقتی یک تابع در سه اسکریپت شما تکرار می‌شود، هر اصلاح را باید سه بار انجام داد. ماژول آن را در یک جا نگه می‌دارد: اسکریپتی از خودتان است که چیزی رسم نمی‌کند و فقط تابع‌ها و نوع‌هایی را در اختیار اسکریپت‌های دیگرتان می‌گذارد.

از یک تابع در خود اسکریپت شروع کنید#

اول تابع را در همان اسکریپتی بنویسید که به آن نیاز دارد و مطمئن شوید درست کار می‌کند:

Cuprel
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 علامت خورده باشد در اختیار اسکریپت‌های دیگر است؛ بقیه مال خود ماژول می‌ماند. این ماژول یک میانگین جاری را در یک رکورد (نوعی با چند فیلد) نگه می‌دارد و دو متد روی آن ارائه می‌کند:

Cuprel
// 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

برای نگه داشتن آن:

  1. ویرایشگر را باز کنید، اسکریپت جدید را بزنید و متن نمونه را با ماژول عوض کنید.
  2. ذخیره را بزنید. وقتی ماژول کامپایل شود، وضعیت کنار نامش کتابخانه — آمادهٔ ایمپورت است.
  3. ماژول چیزی رسم نمی‌کند، پس چیزی برای افزودن به نمودار ندارد. مثل بقیهٔ اسکریپت‌هایتان در اسکریپت‌های من می‌ماند و در تعداد اسکریپت‌هایی که پلن شما نگه می‌دارد حساب می‌شود.

اسکریپت‌های دیگر ماژول را با نامی پیدا می‌کنند که بعد از module نوشته شده (اینجا Stats)، نه با نامی که در فهرست با آن ذخیره شده است، و بزرگی و کوچکی حروف مهم نیست.

واردش کنید#

Cuprel
// 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 استفاده می‌کنند میانگین‌های جاری‌شان را با هم شریک نیستند.

نسخه را نمی‌شود ننوشت:

Cuprel · خطا E2070
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 پیدا می‌شود و فقط ماژول‌های خودتان را می‌شود وارد کرد.

بعدی: درس 13: پیدا کردن اشتباه با لاگ