Crystal یک زبان برنامهنویسی کامپایلشده و شیءگراست. اینها برخی از اهداف این زبان هستند:
نحوهی نگارش با الهام از Ruby.
بررسی نوع بهصورت ایستا، اما بدون نیاز به مشخصکردن نوع متغیرها یا آرگومانهای متد.
امکان فراخوانی کد C با نوشتن اتصالهایی به آن در Crystal.
ارزیابی و تولید کد در زمان کامپایل، برای پرهیز از کدهای قالبی.
کامپایل به کد بومی کارآمد.
کار روی Crystal در سال ۲۰۱۱ با هدف ساختن زبانی آغاز شد که ظرافت و بهرهوری Ruby را داشته باشد، اما کارایی و ایمنی نوع یک زبان کامپایلشده را نیز در خود جای دهد. کامپایلر این زبان در ابتدا به Ruby نوشته شد، اما در سال ۲۰۱۳ به Crystal بازنویسی شد. Ary Borenszweig، Juan Wajnerman و Brian Cardiff این زبان را توسعه دادند و طراحی کردند.
برای اعلام یک متغیر از عملگر انتساب = استفاده کنید.
در Crystal، متغیرها باید از قالب snake_case استفاده کنند.
number = 1
puts number # => 1
number = 2
puts number # => 2
ثابتها با همان عملگر انتساب = اعلام میشوند، اما با حروف تمامبزرگ نوشته میشوند که به آن SCREAMING_SNAKE_CASE میگویند.
NUMBER = 1
puts NUMBER # => 1
انتساب یک مقدار به ثابتی که از قبل تعریف شده است، به خطای زمان کامپایل منجر میشود.
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystal یک زبان کامپایلشده است، یعنی به هر متغیر یا آرگومان متد در زمان کامپایل یک نوع نسبت داده میشود. کامپایلر میتواند نوع یک متغیر یا آرگومان متد را استنتاج کند. با این حال، در برخی موارد باید نوع را مشخص کرد. مواردی که تعیین نوع را لازم دارند، در مفاهیم بعدی توضیح داده میشوند.
متدها راهی برای گروهبندی مجموعهای از دستورها هستند که میتوان دوباره از آنها استفاده کرد.
در Crystal، متدها معمولاً درون یک کلاس، ماژول یا struct تعریف میشوند.
با این حال، متدها را میتوان بیرون از یک کلاس، ماژول یا struct هم تعریف کرد.
متدها با کلیدواژهی def اعلام میشوند که پس از آن اسم متد میآید.
در Crystal، اسم متدها باید در قالب snake_case نوشته شود.
وقتی متدی آرگومانی ندارد، میتوانید پرانتزها را حذف کنید.
برای اعلام پایان یک متد باید از کلیدواژهی end استفاده کنید.
def hello
puts "Hello World!"
end
استفاده از متدی که برای نوع متغیر یا آرگومان متد وجود ندارد، به خطای زمان کامپایل منجر میشود.
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
متدها میتوانند آرگومان داشته باشند. آرگومانها دادههایی هستند که به متد فرستاده میشوند. برای اینکه بتوانید به متدی آرگومان بدهید، باید اسم آرگومان را مشخص کنید. در Crystal، اسم آرگومانها باید در قالب snake_case نوشته شود. یک متد میتواند چند آرگومان داشته باشد، اما آرگومانها باید با کاما از هم جدا شوند.
def hello(name)
puts "Hello #{name}!"
end
متدها میتوانند چندین آرگومان داشته باشند. در این حالت، آرگومانها باید با کاما از هم جدا شوند.
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
وقتی متدی را فراخوانی میکنید که به یک کلاس، ماژول یا struct تعلق دارد، باید از عملگر نقطه (.) استفاده کنید.
قالب آن باید به این شکل باشد: <ClassName>.<method_name>.
وقتی متدی به یک کلاس، ماژول یا struct تعلق ندارد، کافی است آن را با نوشتن اسمش فراخوانی کنید.
متدها همیشه بهصورت ضمنی مقدار آخرین عبارت را برمیگردانند.
وقتی متدی آرگومان دارد، میتوانید هنگام مشخصکردن آرگومانها در فراخوانی و تعریف متد از پرانتز استفاده کنید، مانند این: <method_name>(<argument_1>, <argument_2>, ...).
وقتی متدی آرگومان ندارد، پرانتزها باید حذف شوند.
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
هنگام فراخوانی متدی با چند آرگومان، آرگومانها باید با کاما از هم جدا شوند. آرگومانها باید به همان ترتیبی داده شوند که آرگومانهای متد آمدهاند.
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
فراخوانی متدی با تعداد نادرست آرگومان، به خطای زمان کامپایل منجر میشود.
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
در Crystal، میتوانید از عملگر + برای جمع دو عدد استفاده کنید.
همچنین میتوانید از عملگر - برای تفریق دو عدد استفاده کنید.
و میتوانید از عملگر * برای ضرب دو عدد استفاده کنید.
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
در Crystal، کامنتها با نویسهی # نوشته میشوند که پس از آن یک فاصله و سپس متن کامنت میآید.
از کامنتها برای مستندسازی کد استفاده میشود.
کامپایلر کامنتها را اجرا نمیکند.
# This is a comment