نمادها (Symbols) در روبی
تعریف نماد (Symbol)، تفاوت با رشته، کاربرد و بهینهسازی
نماد چیست؟
نماد (Symbol) یکی از ویژگیهای منحصربهفرد روبی است. نماد مثل یک رشته تغییرناپذیر است که با : شروع میشود.
name = :ali
status = :active
color = :red
puts name.class # => Symbol
puts status # => active
تفاوت نماد و رشته
| ویژگی | رشته (String) | نماد (Symbol) |
|---|---|---|
| تغییرپذیری | تغییرپذیر | تغییرناپذیر |
| حافظه | هر بار شی جدید | یک شی مشترک |
| سرعت | کمی کندتر | سریعتر |
| کاربرد | متن متغیر | نامها و کلیدها |
# رشته — هر بار شی جدید
puts "ali".object_id # => 7012345
puts "ali".object_id # => 7012380 (متفاوت!)
# نماد — همیشه یک شی
puts :ali.object_id # => 1234567
puts :ali.object_id # => 1234567 (یکسان!)
تبدیل بین رشته و نماد
# رشته به نماد
puts "hello".to_sym # => :hello
puts "hello".intern # => :hello (همان to_sym)
# نماد به رشته
puts :hello.to_s # => "hello"
نماد به عنوان کلید هش
مهمترین کاربرد نمادها، استفاده به عنوان کلید هش است:
# با نماد (پیشنهادی)
person = { name: "علی", age: 25 }
puts person[:name]
# با رشته
person2 = { "name" => "علی", "age" => 25 }
puts person2["name"]
نمادها به عنوان کلید هش بهینهتر و سریعتر هستند. همیشه از نماد استفاده کنید مگر اینکه کلید پویا باشد.
نمادها به عنوان متد
# ارسال نماد به عنوان متد
name = "Ali"
puts name.send(:upcase) # => ALI
puts name.public_send(:downcase) # => ali
# با &
["ali", "reza"].map(&:upcase) # => ["ALI", "REZA"]
[1, 2, 3].each(&:puts) # => 1, 2, 3
نمادهای تولیدشده خودکار
روبی برای متدها و متغیرها نماد تولید میکند:
def greet
puts "سلام"
end
puts :greet # => greet (نماد متد)
مقایسه نمادها
puts :ali == :ali # => true
puts :ali == :ali2 # => false
puts :ali == "ali" # => false (نوع متفاوت)
چه زمان از نماد استفاده کنیم؟
✅ از نماد استفاده کنید برای:
- کلید هش:
{ name: "علی" } - وضعیتها:
:active,:pending,:closed - گزینههای متد:
render(format: :json) - نام متدها:
attr_accessor :name
❌ از نماد استفاده نکنید برای:
- متن متغیر و پویا
- ورودی کاربر
- رشتهای که نیاز به تغییر دارد
خلاصه
| عملیات | سینتکس |
|---|---|
| تعریف | :name |
| به رشته | :name.to_s |
| از رشته | "name".to_sym |
| کلید هش | h[:name] |
| متد | obj.send(:method) |
این مبحث بخشی از دوره آموزش کامل روبی است.