نمادها شناسههایی اسمدار هستند که میتوان با آنها به یک مقدار اشاره کرد.
نمادها با نوشتن یک نماد بهصورت مستقیم ساخته میشوند، یعنی با افزودن کاراکتر : به ابتدای یک اسم، مثلاً :foo.
همچنین میتوان آنها را داخل گیومه نوشت، مثلاً :"foo"، که به این ترتیب، مثلاً، استفاده از فاصله در اسم را ممکن میکند.
:foo # => :foo
:"foo boo" # => :"foo boo"
نمادها در جاهای زیادی از زبان به کار میروند، از جمله به عنوان کلید در هشها، و برای نمایش اسم متدها و اسم متغیرها.
چیزی که نمادها را از رشتهها متمایز میکند این است که آنها شناسهاند و نمایندهی داده یا متن نیستند. یعنی دو نماد با اسم یکسان همیشه یک شیء یکساناند.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
نمادها تغییرناپذیرند، یعنی نمیتوان آنها را تغییر داد. پس وقتی یک نماد را «تغییر میدهید»، در واقع دارید نماد تازهای میسازید. چند متد وجود دارد که میتوان با آنها نمادها را دستکاری کرد؛ همهی آنها نمادهای تازهای برمیگردانند. همهی متدها را میتوانید در رابط برنامهنویسی Symbol پیدا کنید.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
مزیت تغییرناپذیر بودن نمادها این است که از نظر حافظه از رشتهها کارآمدترند، و بهعنوان شناسه هم استفادهی ایمنتری دارند.
میتوان نمادها را به رشته تبدیل کرد و برعکس.
این کار وقتی مفید است که بخواهید نمادی را تغییر دهید، یا بخواهید از یک نماد بهعنوان رشته استفاده کنید.
برای تبدیل یک رشته به نماد میتوانید از متد String#to_sym استفاده کنید و برای کار برعکس، از متد Symbol#to_s.
چون نمادها متدهای محدودی دارند، اگر به نماد تازهای نیاز داشته باشید، مفید است که نماد را به رشته تبدیل کنید تا متدهای رشته را روی آن به کار ببرید.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
بندر پالرمو یک لنگرگاه پررفتوآمد است که کشتیهای زیادی به آن وارد و از آن خارج میشوند. مدتهاست که این بندر برای پیگیری کشتیهایی که در حال حاضر در لنگرگاه هستند، یک سامانهی دستی دارد. این سامانه بسیار خطاپذیر است و رئیس بندر تصمیم گرفته آن را با یک سامانهی رایانهای جایگزین کند.
رئیس بندر شما را استخدام کرده است تا سامانهی جدید را پیادهسازی کنید. این سامانه باید شناسهها را برای کشتیها و همچنین برای مقصدها مدیریت کند.
اولین کاری که باید انجام دهید این است که شناسهی بندر پالرمو را بسازید. شناسه از چهار حرف اول اسم بندر تشکیل میشود، با حروف بزرگ.
ثابت Port::IDENTIFIER را طوری تعریف کنید که یک نماد با مقدار :PALE باشد.
Port::IDENTIFIER
# => :PALE
برنامه باید بندرهای دیگر را هم مدیریت کند، بنابراین باید برای آنها هم شناسه بسازید. بندر میخواهد این سامانه خودکار باشد و چون بندرها از قراردادهای نامگذاری متفاوتی استفاده میکنند، شناسهها باید از اسم بندر تولید شوند. شناسه از چهار حرف اول اسم بندر تشکیل میشود، با حروف بزرگ.
متد Port.get_identifier را طوری تعریف کنید که یک رشته به عنوان آرگومان بگیرد و شناسهی آن بندر را به صورت یک نماد برگرداند.
Port.get_identifier("Hamburg")
# => :HAMB
بندر دو ترمینال دارد و سامانه باید تعیین کند که یک کشتی باید در کدام ترمینال پهلو بگیرد. ترمینال بر اساس شناسهی کشتی مشخص میشود.
شناسه از ۲ بخش ساخته میشود؛ بخش اول از ۳ حرف بزرگ تشکیل شده است که میگوید کشتی چه باری حمل میکند و سپس ۳ عدد که شناسهی یکتای کشتی است.
اگر کشتی بار OIL یا GAS را حمل کند، باید در ترمینال A پهلو بگیرد. در غیر این صورت، کشتی باید در ترمینال B پهلو بگیرد.
متد Port.get_terminal را طوری تعریف کنید که یک نماد به عنوان آرگومان بگیرد که همان شناسهی کشتی است.
متد باید ترمینال را به صورت یک نماد برگرداند.
Port.get_terminal(:OIL123)
# => :A