5.1.1. محتوای رشته
نکته
این یک مبحث پیشرفته است. زبان Nix به گونهای طراحی شده است که بدون نیاز به اینکه برنامه نویس آگاهانه با زمینه رشتهها سر و کار داشته باشد یا حتی بداند آنها چیستند، مورد استفاده قرار گیرد.
یک رشته در زبان Nix صرفاً دنبالهای از کاراکترها مانند رشتهها در سایر زبانها نیست. بلکه در واقع زوجی از یک دنباله از کاراکترها و یک زمینه رشته (string context) است. زمینه رشته یک مجموعه (بدون ترتیب) از عناصر زمینه رشته است.
هدف از زمینههای رشته، جمعآوری مقادیر غیررشتهای متصلشده به رشتهها از طریق الحاق رشته، درونگذاری رشته، و عملیاتهای مشابه است. ایده این است که کاربر میتواند هنگام ایجاد فایلهای متنی از طریق عبارتهای Nix، بدون پیگیری دستی مسیرهای دقیق، به فایلهای دیگر ارجاع دهد. Nix تضمین خواهد کرد که تمام فایلهای ارجاعشده قابل دسترسی باشند - یعنی تمام مسیرهای انبار معتبر باشند.
نکته
زمینههای رشته در کد به سبک متعارف (idiomatic) زبان Nix بهطور صریح دستکاری نمیشوند.
عناصر زمینه رشته به شکلهای مختلفی وجود دارند:
-
یک عنصر زمینه رشته از این نوع، یک مسیر اشتقاقپذیر است. آنها میتوانند از نوع ثابت یا خروجی باشند که با انواع مسیرهای اشتقاقپذیر مطابقت دارند.
-
مثال
builtins.storePathیک رشته با یک عنصر زمینه رشته ثابت منفرد ایجاد میکند:
-
builtins.getContext (builtins.storePath "/nix/store/ikwkxz4wwlp2g1428n7dy729cg1d9hin-hello-2.10")ارزیابی میشود به
{ "/nix/store/ikwkxz4wwlp2g1428n7dy729cg1d9hin-hello-2.10" = { path = true; }; }
-
مثال
رفتار زمینههای رشتهای به بهترین شکل با یک تابع توکار که همچنان آزمایشی است نشان داده میشود:
builtins.outputOf. این مثال با نسخه پایدار Nix کار نخواهد کرد!
builtins.getContext (builtins.outputOf (builtins.storePath "/nix/store/fvchh9cvcr7kdla6n860hshchsba305w-hello-2.12.drv") "out")ارزیابی میشود به
{ "/nix/store/fvchh9cvcr7kdla6n860hshchsba305w-hello-2.12.drv" = { outputs = [ "out" ]; }; }
-
مفهوم derivation deep یک ویژگی پیشرفته است که برای استفاده با
exportReferencesGraphderivation attribute در نظر گرفته شده است. یک عنصر زمینه رشتهای derivation deep یک مسیر derivation است و هم به خروجیهای آن و هم به کل کلوژر ساخت (build closure) آن derivation اشاره دارد: تمام خروجیهای آن، تمام derivationهای دیگری که derivation دادهشده به آنها وابسته است، و تمام خروجیهای آنها.مثال
بهترین راه برای نشان دادن زمینههای رشتهای derivation deep استفاده از
builtins.addDrvOutputDependenciesاست. یک عنصر زمینه رشتهای ثابت معمولی را که به یک derivation اشاره میکند در نظر بگیرید، و آن را به یک عنصر زمینه رشتهای «Derivation deep» تبدیل کنید.
builtins.getContext (builtins.addDrvOutputDependencies (builtins.storePath "/nix/store/fvchh9cvcr7kdla6n860hshchsba305w-hello-2.12.drv"))ارزیابی میشود به
{ "/nix/store/fvchh9cvcr7kdla6n860hshchsba305w-hello-2.12.drv" = { allOutputs = true; }; }
بررسی زمینههای رشته (string contexts)
بهطور کلی، builtins.hasContext مشخص میکند که آیا یک رشته دارای زمینه غیرخالی است یا خیر.
هنگامی که به اطلاعات با دانهبندی ریزتر نیاز باشد، میتوان از builtins.getContext استفاده کرد.
این تابع یک [مجموعه صفت] نماینده زمینه رشته ایجاد میکند که میتوان آن را طبق روال عادی بررسی کرد.
پاکسازی زمینههای رشته
builtins.unsafeDiscardStringContext کپیای از یک رشته، اما با زمینه رشتهی خالی ایجاد میکند.
رشته بازگرداندهشده را میتوان به راههای بیشتری استفاده کرد؛ مثلاً توسط عملگرهایی که نیازمند خالی بودن زمینه رشته هستند.
لزوم پاک کردن صریح زمینه رشته در چنین مواردی کمک میکند تا اطمینان حاصل شود که عناصر زمینه رشته بهاشتباه از دست نمیروند.
نشانگر «ناامن» (unsafe) تنها برای یادآوری این موضوع است که Nix بهطور معمول تضمین میکند که وابستگیها ردیابی میشوند، در حالی که رشته بازگرداندهشده آنها را از دست داده است.
ساخت زمینههای رشته
builtins.appendContext کپیای از یک رشته، اما با عناصر زمینه رشتهی اضافی ایجاد میکند.
زمینه بهطور صریح توسط یک [مجموعه صفت] در قالبی که builtins.getContext تولید میکند، مشخص میشود.
یک رشته با زمینههای دلخواه را میتوان به این شکل ساخت:
- ایجاد یک رشته با عناصر زمینه رشتهی دلخواه. (محتویات رشته اهمیتی ندارند.)
- استخراج زمینه آن با
builtins.getContext. - ترکیب آن با یک رشته پایه و فراخوانیهای مکرر
builtins.appendContext.