Crystal نوعی به اسم String دارد که برای نمایش متن استفاده میشود.
رشتههای Crystal دنبالهای از نویسههای یونیکد هستند.
رشتهها تغییرناپذیرند، یعنی پس از ساختهشدن نمیتوان آنها را تغییر داد.
این یعنی هر بار که رشتهای را تغییر میدهید، رشتهی جدیدی ساخته میشود؛ بنابراین رشتهی اصلی تغییر نمیکند.
برای تعریف یک رشته از گیومهی دوتایی " استفاده میکنید.
"Hello World"
برای الحاق دو رشته، از عملگر + استفاده کنید.
عملگر + رشتهی جدیدی برمیگرداند که از ترکیب آن دو رشته به دست میآید.
hello = "Hello"
hello + " World"
# => "Hello World"
متد to_i یک رشته را به عدد صحیح تبدیل میکند.
بهعنوان جایگزین، میتوان از متد to_f استفاده کرد که یک عدد اعشاری برمیگرداند.
اگر رشته نتواند به عدد تبدیل شود، یک ArgumentError ایجاد میشود.
"1".to_i
# => 1
"1.0".to_f
# => 1.0
"Hello".to_i
# => ArgumentError: Invalid integer: Hello
یک عدد صحیح یا اعشاری را میتوان با متد to_s به رشته تبدیل کرد.
1.to_s
# => "1"
1.0.to_s
# => "1.0"
درونیابی روشی راحت برای ترکیب رشتهها و جایدادن عبارتها درون رشتههاست.
برای درونیابی یک رشته، میتوانید از نویسهی # و بعد از آن آکولاد {} استفاده کنید و عبارت را داخل آکولادها بنویسید.
name = "World"
"Hello #{name}!"
# => "Hello World!"
Crystal نتیجهی عبارت را بهطور خودکار به رشته تبدیل میکند.
"Hello #{1 + 1}!"
# => "Hello 2!"
وقتی میخواهید تعداد نویسههای یک رشته را بدانید، میتوانید از متد size استفاده کنید که طول رشته را بهصورت یک عدد صحیح برمیگرداند.
اندازهی یک رشته یک ویژگی ذخیرهشده در همان رشته است، پس لازم نیست هر بار که متد را فراخوانی میکنید اندازه را حساب کند و همین آن را بسیار سریع میکند.
"Hello World".size
# => 11
اندیسگذاری یعنی بخواهید نویسهی مشخصی را از یک رشته به دست آورید.
برای گرفتن یک نویسه از یک String میتوانید از همان نماد کروشهی آشنا استفاده کنید.
[] بهصورت یک متد نمونه روی String پیادهسازی شده است که اندیس، آرگومان متد است.
اولین نویسه در یک رشته در اندیس ۰ قرار دارد.
"Hello World"[0]
# => 'H'
"Hello World"[6]
# => 'W'
برای گرفتن نویسهای از انتهای یک رشته، میتوانید طول رشته منهای یک را بگیرید تا اندیس آخرین نویسه به دست آید و برای نویسهی یکیمانده به آخر، طول رشته منهای دو را و به همین ترتیب. برای این کار میانبری هم وجود دارد و آن استفاده از اندیس منفی است، به این صورت که آخرین نویسه در اندیس ۱-، نویسهی یکیمانده به آخر در اندیس ۲- و به همین ترتیب قرار دارد.
name = "Hello World"
name[name.size - 1]
# => 'd'
name[-1]
# => 'd'
برخی نویسهها را نمیتوان مستقیم در یک رشته نوشت؛ در عوض باید از یک دنبالهی فرار استفاده کنید.
برای مثال، اگر بخواهید از گیومهی دوتایی در یک رشته استفاده کنید، باید آن گیومهها را فرار دهید.
میتوانید از نویسهی \ برای نوشتن یک دنبالهی فرار استفاده کنید و بعد از آن نویسهای را بنویسید که میخواهید فرار دهید.
اینها نویسههای ویژه در Crystal هستند:
| مقدار | توضیح |
|---|---|
\a |
هشدار |
\b |
بکاسپیس |
\e |
فرار |
\f |
فرمفید |
\n |
سرخط یا خط جدید |
\r |
بازگشت به ابتدای خط |
\t |
تب افقی |
\v |
تب عمودی |
\\ |
بکاسلش |
\' |
گیومهی تک |
\" |
گیومهی دوتایی |
\377 |
نویسهی اکتال ASCII |
\xFF |
نویسهی هگزادسیمال ASCII |
\uFFFF |
نویسهی هگزادسیمال یونیکد |
puts "Hello \"World\""
# => Hello "World"
puts "Hello \nWorld"
# => Hello
# => World
برای نوشتن یک رشتهی چندخطی، از همان نحوهی نگارش رشتهی تکخطی استفاده میکنید، با این تفاوت که برای هر خطی که میخواهید در رشته بیاید یک خط جدید میسازید.
"Hello
World"
# => "Hello\nWorld"
روزی روزگاری برنامهنویسی عجیبوغریب در خانهای عجیب با پنجرههای میلهدار زندگی میکرد. یک روز، کاری را از یک تابلوی کاریابی آنلاین پذیرفت تا یک ربات مهمانی بسازد. قرار است این ربات به مردم خوشامد بگوید و آنان را تا سر جایشان همراهی کند. نسخهی اول بسیار فنی بود و نشان میداد که برنامهنویس در تعامل با انسانها مهارت ندارد. بخشی از همین کاستیها به نسخهی بعدی هم راه پیدا کرد.
متد welcome را طوری پیادهسازی کنید که با استفاده از اسم دادهشده، پیام خوشامدگویی برگرداند:
PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!
متد happy_birthday را طوری پیادهسازی کنید که با استفاده از اسم و سن فرد، پیام تولد را برگرداند.
متأسفانه برنامهنویس کمی اهل خودنمایی است، بنابراین ربات باید دانشش از تولد هر مهمان را نشان دهد.
PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!
تابع assign_table را برای مسیر دادن پیادهسازی کنید.
این تابع باید ۵ پارامتر بپذیرد.
String)Int)String)String)Float64)قالب دقیق نتیجه را میتوانید در مثال زیر ببینید.
اسم همنشین باید به حرف اول و آخر اسم کوتاه شود. Frank به Fk تبدیل میشود، Christian به Cn و به همین ترتیب.
ربات شمارهی میز را اعلام میکند. ربات فاصلهی میز را هم ذکر میکند. خوشبختانه فقط با دقتی محدود به ۱ رقم.
PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.