هش‌ها در روبی

تعریف هش، کلید-مقدار، متدها، پیمایش و کار با هش در روبی

هش چیست؟

هش (Hash) مجموعه‌ای از جفت‌های کلید-مقدار است. مثل دیکشنری — هر کلید به یک مقدار اشاره می‌کند. هش‌ها برای ذخیره داده‌های ساختاریافته عالی هستند.

تعریف هش

# هش خالی
empty = {}
empty = Hash.new

# هش با نماد (Symbol) به عنوان کلید
person = {
  name: "علی",
  age: 25,
  city: "تهران"
}

# هش با رشته به عنوان کلید (سبک قدیمی)
person2 = {
  "name" => "مریم",
  "age" => 30
}
در روبی مدرن، از نماد (Symbol) به عنوان کلید استفاده می‌شود: { name: "علی" }. این سبک تمیزتر و بهینه‌تر است.

دسترسی به مقادیر

person = { name: "علی", age: 25, city: "تهران" }

# با نماد
puts person[:name]  # => علی
puts person[:age]   # => 25

# متد fetch (با مقدار پیش‌فرض)
puts person.fetch(:name)          # => علی
puts person.fetch(:email, "نامشخص")  # => نامشخص

تغییر و افزودن

person = { name: "علی", age: 25 }

# تغییر مقدار
person[:age] = 26

# افزودن کلید جدید
person[:email] = "ali@example.com"

puts person.inspect
# => {:name=>"علی", :age=>26, :email=>"ali@example.com"}

حذف از هش

person = { name: "علی", age: 25, city: "تهران" }

# حذف با کلید
person.delete(:city)

puts person.inspect  # => {:name=>"علی", :age=>25}

پیمایش هش

person = { name: "علی", age: 25, city: "تهران" }

# each با کلید و مقدار
person.each do |key, value|
  puts "#{key}: #{value}"
end

# each_key — فقط کلیدها
person.each_key { |k| puts k }

# each_value — فقط مقادیر
person.each_value { |v| puts v }

متدهای مفید هش

متدتوضیحمثال
keysآرایه کلیدهاh.keys → [:name, :age]
valuesآرایه مقادیرh.values → ["علی", 25]
length / sizeتعداد جفت‌هاh.length → 2
empty?آیا خالی؟{}.empty? → true
has_key?آیا کلید دارد؟h.has_key?(:name) → true
has_value?آیا مقدار دارد؟h.has_value?("علی") → true
mergeترکیب دو هشh1.merge(h2)
selectفیلتر کردنh.select { true }
transform_valuesتبدیل مقادیرh.transform_values { upcase }

مقدار پیش‌فرض

# با Hash.new
counts = Hash.new(0)
counts["apple"] += 1
counts["apple"] += 1
counts["banana"] += 1
puts counts.inspect  # => {"apple"=>2, "banana"=>1}

# با بلوک
h = Hash.new { |hash, key| hash[key] = [] }
h["fruits"] << "سیب"
h["fruits"] << "موز"
puts h.inspect  # => {"fruits"=>["سیب", "موز"]}

ترکیب هش‌ها (merge)

defaults = { theme: "light", lang: "fa" }
user_prefs = { theme: "dark" }

settings = defaults.merge(user_prefs)
puts settings.inspect  # => {:theme=>"dark", :lang=>"fa"}

تبدیل هش به آرایه و برعکس

h = { a: 1, b: 2 }
arr = h.to_a   # => [[:a, 1], [:b, 2]]
h2 = arr.to_h  # => {:a=>1, :b=>2}

هش‌های تو در تو

users = {
  ali: { name: "علی", age: 25 },
  maryam: { name: "مریم", age: 30 }
}

puts users[:ali][:name]  # => علی
puts users[:maryam][:age] # => 30

خلاصه

عملیاتسینتکس
تعریف{ key: value }
دسترسیh[:key]
تغییرh[:key] = val
حذفh.delete(:key)
کلیدهاh.keys
مقادیرh.values
ترکیبh1.merge(h2)

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

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