5.2.3. لیترالهای رشته
یک مقدار متنی (string literal) نمایانگر یک مقدار رشتهای است.
نحو (Syntax)
expression → string
string →
"( string_char* interpolation_element )* string_char*"string →
''( indented_string_char* interpolation_element )* indented_string_char*''string → uri
string_char ~
[^"$\\]|\$(?!\{'{'})|\\.indented_string_char ~
[^$']|\$\$|\$(?!\{'{'})|''[$']|''\\.|'(?!')uri ~
[A-Za-z][+\-.0-9A-Za-z]*:[!$%&'*+,\-./0-9:=?@A-Z_a-z~]+
رشتهها را میتوان به سه روش نوشت.
متداولترین روش، قرار دادن رشته بین دو نقلقول دوتایی است، مثلاً "foo bar".
رشتهها میتوانند چندین خط را در بر بگیرند.
نتایج سایر عبارتها را میتوان با قرار دادن آنها در داخل ${'{'} {'}'} در یک رشته وارد کرد؛ قابلیتی که به آن [درونگذاری رشته] (string interpolation) گفته میشود.
برای نمایش کاراکترهای زیر در داخل یک رشته، باید با قرار دادن یک اسلش روبهپشت (\) در ابتدای آنها، آنها را از کاراکترهای عادی متمایز (Escape) کرد:
- نقلقول دوتایی (
")
مثال
"\"""\""
- بکاسلش (
\)
مثال
"\\""\"
- علامت دلار به دنبال یک آکولاد باز (
${'{'}) – "dollar-curly"
مثال
"\${""\${"
کارکترهای خط جدید، بازگشت به خط و تب را میتوان به ترتیب به صورت \n، \r و \t نوشت.
یک علامت «دو دلاری همراه با آکولاد» ($${'{'}) را میتوان به صورت تحتاللفظی نوشت.
مثال
"$${""$\${"
مقادیر رشتهای با فرار (escaping) مخصوص Nix روی ترمینال چاپ میشوند. رشتههایی که در فایلها نوشته میشوند حاوی کاراکترهای رمزگذاریشده توسط این فرار خواهند بود.
دومین روش برای نوشتن مقادیر حرفی رشتهای به صورت یک رشته تورفته است که بین جفتهایی از نقلقول تکی مضاعف ('') محصور میشود، به این صورت:
''
This is the first line.
This is the second line.
This is the third line.
'' این نوع از متنهای ثابت (string literal) به طور هوشمندانهای تو رفتگی (indentation) را از ابتدای هر خط حذف میکند. به طور دقیقتر، این قابلیت تعداد فضاهای خالی برابر با کمترین میزان تو رفتگی کل رشته را از هر خط حذف میکند (بدون در نظر گرفتن تو رفتگی خطوط خالی). برای نمونه، خط اول و دوم دارای دو فضای خالی تو رفتگی هستند، در حالی که خط سوم چهار فضای خالی تو رفتگی دارد. بنابراین، دو فضای خالی از هر خط حذف میشود، به طوری که رشتهی حاصل به این صورت در میآید
"This is the first line.\nThis is the second line.\n This is the third line.\n" نکته
فاصلههای خالی و کاراکتر خط جدید پس از
''بازشو در صورتی که هیچ متن غیرفاصهخالی روی خط اول وجود نداشته باشد، نادیده گرفته میشوند.
هشدار
کاراکترهای تب پیشوند حذف نمیشوند.
مثال
رشته تورفتهی زیر دارای تبهایی به عنوان پیشوند است:
<pre><code class="nohighlight">'' all: @echo hello '' </code></pre>
"\tall:\n\t\t@echo hello\n"
رشتههای تورفته از [درونگذاری رشته] پشتیبانی میکنند.
برای نمایش موارد زیر در یک رشته تورفته، باید آنها را escape کنید:
- کاراکتر
$با قرار دادن دو نقلقول تکی ('') در پیشوند آن، escape میشود.
مثال
'' ''$ ''"$\n"
- کاراکتر
''با قرار دادن یک نقلقول تکی (') در ابتدای آن، اسکیپ (escape) میشود.
خ ل ع > مثال
'' ''' ''"''\n"
این کاراکترهای خاص به شکل زیر escape میشوند:
- خطجدید (
\n):''\n - بازگشت به خط (
\r):''\r - تب (
\t):''\t
کاراکتر ''\ هر کاراکتر دیگری را escape میکند.
یک «dollar-curly» (${'{'}) را میتوان به صورت زیر نوشت:
مثال
'' echo ''${PATH} ''"echo ${PATH}\n"
نکته
این روش با نحوِ فرار دادن (escape) علامت دلار و آکولاد باز در داخل نقلقولهای دوتایی (
"\${'{'}") متفاوت است. آگاه باشید که در هر لحظه به کدامیک نیاز دارید.
یک «علامت دلار-دلار-آکولاد باز» ($${'{'}) را میتوان به صورت تحتاللفظی نوشت.
مثال
'' $${ ''"$\${\n"
رشتههای تورفته عمدتاً به این دلیل مفید هستند که به لترالهای رشتهای چندخطی اجازه میدهند از تورفتهبودن عبارت Nix دربرگیرنده تبعیت کنند، و همچنین برای رشتههایی که زبانهایی مانند اسکریپتهای شل و فایلهای پیکربندی را نمایش میدهند، معمولاً به فرار (escaping) کمتری نیاز است؛ زیرا '' بسیار کمتر از " رایج است. مثال:
stdenv.mkDerivation {
...
postInstall =
''
mkdir $out/bin $out/etc
cp foo $out/bin
echo "Hello World" > $out/etc/foo.conf
${if enableBar then "cp bar $out/bin" else ""}
'';
...
} در نهایت، به عنوان یک ویژگی تسهیلی، URIها (همانطور که در پیوست B سند RFC 2396 تعریف شدهاند) را میتوان همانگونه که هستند و بدون نقلقول نوشت. برای نمونه، رشتهٔ "http://example.org/foo.tar.bz2" را میتوان به صورت http://example.org/foo.tar.bz2 نیز نوشت.