هشها در روبی
تعریف هش، کلید-مقدار، متدها، پیمایش و کار با هش در روبی
هش چیست؟
هش (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) |
این مبحث بخشی از دوره آموزش کامل روبی است.