در Ruby، String هم مثل هر چیز دیگری یک شیء است.
«رشتهها» از دنبالهای دلخواه از بایتها (معمولاً کاراکترها) ساخته میشوند و مانند هر شیء دیگری مقداردهی اولیه و دستکاری میشوند.
در واقع، یکی از مفیدترین ویژگیهای Ruby، متدهای پرشماری است که میتوان روی رشتهها (و دیگر اشیاء) فراخوانی کرد تا در نوشتن کد زمان زیادی صرفهجویی شود.
در این تمرین میخواهیم برخی از این متدهای کمکی را بررسی کنیم و با آنها کار کنیم.
اگرچه میتوانید از String.new(...) برای ساخت یک رشته استفاده کنید، استفاده از یک «لیترال» بسیار رایجتر است.
انواع مختلفی از لیترالها وجود دارد که میتوانید استفاده کنید. این لیترالها به دو دسته تقسیم میشوند: آنهایی که امکان «درج» را فراهم میکنند و آنهایی که نمیدهند.
رایجترین لیترالها، نقلقولهای تکی و دوتایی هستند ('...' و "...").
نقلقولهای تکی امکان درج را نمیدهند، در حالی که نقلقولهای دوتایی میدهند.
درج یعنی یک رشته با استفاده از نحوهی نگارش #{} در رشتهی دیگری قرار میگیرد.
# Use single quotes when not interpolated
location = 'World'
# And double quotes when interpolated
puts "Hello, #{location}!" #=> "Hello, World!"
همچنین میتوانید از لیترالهای دیگری مانند %{... } برای رشتههای درجشده و %q{...} برای رشتههای بدون درج استفاده کنید.
اینها زمانی مفید هستند که رشتهتان شامل کاراکترهای ' یا " باشد.
توجه: هیچ قانون قطعیای وجود ندارد که بگوید اگر رشتهتان درج ندارد، باید از رشتههای بدون درج استفاده کنید.
بهتر است به رشتهها در Ruby شبیه به آرایهها فکر کنید.
آنها اندازه دارند و کاراکترهایشان «ایندکس» میشوند (با 0 به عنوان اولین ایندکس):
my_string = "Some string"
my_string.size #=> 11
my_string[0] #=> 'S'
my_string[1] #=> 'o'
my_string[-1] #=> 'g'
# Find the first index of a character
my_string.index('m') #=> 2
بخشهایی از رشتهها را میتوان با ایندکسها یا slice استخراج کرد:
my_string = "Some string"
# Find three characters starting with the second character (index 1)
my_string[1, 3] #=> "ome"
my_string.slice(1, 3) #=> "ome"
مقادیر معنایی رشتهها را هم میتوان دستکاری کرد. ارزش دارد مستندات Ruby را بررسی کنید تا دربارهی همهی متدها یاد بگیرید، اما در اینجا چند مثال پرکاربرد آورده شده است:
"hello".capitalize #=> "Hello"
"HELLO".downcase #=> "hello"
"hello".center(9) #=> " hello "
" hello ".strip #=> "hello"
"hello world".split(" ") #=> ["hello", "world"]
همچنین میتوانید از متدهایی مانند gsub برای جایگزینی کاراکترها استفاده کنید:
# Replace one character with another
"noob".gsub("o","0") #=> "n00b"
# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'') #=> "Rby rlly rcks"
در همهی مثالهای بالا، یک String جدید برگردانده میشود.
با این حال، بسیاری از متدها معادلهایی دارند که به ! ختم میشوند و در واقع خود رشته را تغییر میدهند.
# Use normal methods to return new strings
my_string = "hello"
my_string.capitalize #=> "Hello"
puts my_string #=> "hello"
# And bang-methods (...!) to modify the object
my_string = "hello"
my_string.capitalize! #=> "Hello"
puts my_string #=> "Hello"
در این تمرین، خطهای لاگ را پردازش میکنید.
هر خط لاگ رشتهای است با این قالب: "[<LEVEL>]: <MESSAGE>".
سه سطح لاگ مختلف وجود دارد:
INFOWARNINGERRORسه وظیفه دارید که هرکدام یک خط لاگ میگیرند و از شما میخواهند کاری با آن انجام دهید. راههای زیادی برای حل این وظیفهها وجود دارد؛ از میان مثالهای بالا روشهای دلخواهتان را انتخاب کنید و ببینید به چه نتیجهای میرسید.
متد LogLineParser#message را طوری پیادهسازی کنید که پیام یک خط لاگ را برگرداند:
LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"
هر فاصلهی سفید ابتدایی یا انتهایی باید حذف شود:
LogLineParser.new("[WARNING]: Disk almost full\r\n").message
# => "Disk almost full"
متد LogLineParser#log_level را طوری پیادهسازی کنید که سطح لاگ یک خط لاگ را برگرداند؛ این سطح باید با حروف کوچک برگردانده شود:
LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"
متد LogLineParser#reformat را پیادهسازی کنید که خط لاگ را دوباره قالببندی میکند، به این صورت که اول پیام و بعد از آن سطح لاگ را داخل پرانتز قرار میدهد:
LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"