5.2.6. درونگذاری رشته
درونگذاری رشته یک ویژگی زبانی است که در آن یک [رشته]، [مسیر] یا نام صفت میتواند حاوی عبارتهایی باشد که در داخل ${'{'} {'}'} (علامت دلار با آکولاد) قرار گرفتهاند.
چنین ساختاری رشته درونگذاریشده نامیده میشود و عبارت درون آن یک عبارت درونگذاریشده است.
نحو
interpolation_element →
${'{'}expression{'}'}
مثالها
رشته
بهجای نوشتن
"--with-freetype2-library=" + freetype + "/lib" (که در آن freetype یک عبارت derivation است)، به جای آن میتوانید بنویسید
"--with-freetype2-library=${freetype}/lib" مورد دوم بهطور خودکار به مورد اول ترجمه میشود.
یک مثال پیچیدهتر (از عبارت Nix مربوط به Qt):
configureFlags = "
-system-zlib -system-libpng -system-libjpeg
${if openglSupport then "-dlopen-opengl
-L${mesa}/lib -I${mesa}/include
-L${libXmu}/lib -I${libXmu}/include" else ""}
${if threadSupport then "-thread" else "-no-thread"}
"; توجه داشته باشید که عبارتها و رشتههای Nix میتوانند به طور دلخواه تو در تو باشند؛ در این حالت، رشتهی بیرونی شامل عبارتهای درونگذاریشدهی مختلفی است که خودشان حاوی رشتههایی هستند (مانند "-thread" به عنوان مثال)، و برخی از آنها به نوبه خود حاوی عبارتهای درونگذاریشده هستند (مانند $).
برای نوشتن یک${'{'} به صورت صریح در یک رشتهی معمولی، آن را با یک اسلش به عقب (\) فرار (escape) دهید.
مثال
"echo \${PATH}""echo ${PATH}"
برای نوشتن یک کاراکتر ${'{'} به شکل تحتاللفظی (literal) در یک رشته تورفته، آن را با دو علامت نقلقول تکی ('') فرار (escape) دهید.
مثال
'' echo ''${PATH} ''"echo ${PATH}\n"
مقدار $${'{'} را میتوان به صورت تحتاللفظی در هر رشتهای نوشت.
مثال
در ابزار Make، علامت
$در نام فایلها یا دستورات ساخت به شکل$$نمایش داده میشود؛ برای اطلاعات بیشتر به GNUmake: Basics of Variable Reference مراجعه کنید. این موضوع را میتوان مستقیماً در رشتههای زبان Nix بیان کرد:'' MAKEVAR = Hello all: @export BASHVAR=world; echo $(MAKEVAR) $${BASHVAR} ''"MAKEVAR = Hello\nall:\n\t@export BASHVAR=world; echo $(MAKEVAR) $\${BASHVAR}\n"
برای جزئیات بیشتر، مستندات مربوط به رشتهها را ببینید.
مسیر (Path)
بهجای نوشتن
./. + "/" + foo + "-" + bar + ".nix" یا
./. + "/${foo}-${bar}.nix" میتوانید به جای آن بنویسید
./${foo}-${bar}.nix نام صفت (attribute)
نامهای صفت (attribute) میتوانند رشتههای درونگذاریشده باشند.
مثال
let name = "foo"; in { ${name} = 123; }{ foo = 123; }
صفتها (attributes) را میتوان با رشتههای درونگذاریشده انتخاب کرد.
مثال
let name = "foo"; in { foo = 123; }.${name}123
عبارت درونگذاریشده
عبارتی که درونگذاری میشود باید به یکی از موارد زیر ارزیابی شود:
یک [رشته]
یک [مسیر]
یک [مجموعه ویژگی] که دارای صفت
__toStringیا صفتoutPathباشد- صفت
__toStringباید تابعی باشد که خود مجموعه ویژگی را به عنوان آرگومان گرفته و یک رشته برمیگرداند - صفت
outPathباید یک رشته باشد
این مورد شامل عبارتهای derivation یا ورودیهای فلیک (آزمایشی) نیز میشود.
- صفت
یک رشته به خودش درونگذاری میشود.
یک مسیر در یک عبارت درونگذاریشده ابتدا در انبار Nix کپی میشود، و رشتهی حاصل همان [مسیر انبار][شیء انبار] (store object) تازه ایجادشده است (store/store-object.md).
مثال
$ mkdir fooبه پوشه خالی در یک عبارت درونگذاریشده ارجاع دهید:
"${./foo}""/nix/store/2hhl2nz5v0khbn06ys82nrk99aa1xxdw-foo"
یک derivation هنگام درونگذاری به مسیر انبار نخستین output خود تبدیل میشود.
مثال
let pkgs = import <nixpkgs> {}; in "${pkgs.hello}""/nix/store/qnlr7906z0mrl2syrkdbpicffq02nw07-hello-2.12.1"
یک مجموعه ویژگی به مقدار بازگشتی تابع موجود در __toString که روی خودِ مجموعه ویژگی اعمال شده است، درونگذاری میشود.
مثال
let a = { value = 1; __toString = self: toString (self.value + 1); }; in "${a}""2"
یک مجموعه ویژگی (attribute set) نیز به مقدار صفت outPath خود درونگذاری میشود.
مثال
let a = { outPath = "foo"; }; in "${a}""foo"
اگر هم __toString و هم outPath در یک مجموعه ویژگی حضور داشته باشند، __toString اولویت دارد.
مثال
let a = { __toString = _: "yes"; outPath = throw "no"; }; in "${a}""yes"
اگر هیچکدام وجود نداشته باشد، خطایی پرتاب میشود.
مثال
let a = {}; in "${a}"error: cannot coerce a set to a string: { }
at «string»:4:2:
3| in 4| "${a}" | ^
nix.dev/manual/nix/stable/language/string-interpolation.html