نمادها (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)

این مبحث بخشی از دوره آموزش کامل روبی است.

ابزارهای مرتبط