iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

富士大顆系列 第 9

vol.09 如紅寶石般閃耀的您-Ruby 學習筆記 (五) hash methods 10+ 選!

  • 分享至 

  • xImage
  •  

你好,我是富士大顆 Aiko
今天來介紹 hash 的常見 methods!


As usual, let's talk about what Hash is.

Hash 是程式語言常用的數據結構之一,在 Ruby 中,用於儲存「成對」型的值( key-value pairs )且有以下特點:

  1. Key & Value 成對:一组 Key 和對應的值組成。
  2. 每個 key 都必須是唯一的,而值可以重複
  3. {} & symbol & =>:古典寫法,使用 symbol 為 key 。例如:
    hash = { :name => "Aiko", :age => 33 }
    
  4. {} & ::現代寫法,省略 => 符號,例如:
    hash = { name: "Aiko", age: 33 }
    #這裡看起來 name 不是 :name 但其實是 symbol!!
    #所以要查找要這樣 puts _hash[:name]
    
  5. 動態:可以動態增加或删除 Key & Value。
  6. 快速查找:Ruby 有送很多 methods 詳情參考下面的介紹。
  7. 無序性:Key & Value 跟陣列不同,是沒有次序、順序的。
  8. 可混合數據類型:包括字串、數字、數組、其他 hash 等。
  9. 可以設置預設值:當查詢時取用不存在的 key 時,例如:
profile = Hash.new("Unknown")
#預設值是"Unknown"

profile["name"] = "Aiko"
profile["age"] = 33
把key"name"&"age"的 value 放進 hash 裡

puts profile["name"] #"Aiko"
puts profile["age"]  #33
# access to those keys

puts profile.keys 
#["name", "age"]
#profile 這個 hash 裡面並沒有 "gender"這個 key

puts profile["gender"] 
#"Unknown"

總結,以下是一個操作 hash 的範例:

# 創建 hash
person = { name: "Aiko", age: 33, city: "Osaka" }

# access keys
puts person[:name] #"Aiko"
puts person[name] #這樣寫會錯!!!
puts person[:age] #33
puts person[age] #這樣寫會錯!!!

# 增加新的一組 key&value
person[:occupation] = "Engineer"

# 迭代.each 的使用
person.each do |key, value|
  puts "#{key}: #{value}"
end

# name: Aiko
# age: 33
# city: Osaka
# occupation: Engineer

新增/修改/刪除

update(other_hash): 更新 hash 中的 key&value。

hash = { name: "Aiko", age: 33 }
puts hash.update({ age: 18 }) # 更新年龄
#{ :name => "Aiko", :age => 18 }

transform_keys(&block): 使用指定的操作轉換所有的 key。會創造新 hash

hash = { name: "Aiko", age: 33 }
puts hash.transform_keys { |key| key.to_s }
#{ "name" => "Aiko", "age" => 33 }

merge(other_hash): 合併兩個 hash。會創造新 hash

hash1 = { name: "Aiko", age: 33 }
hash2 = { city: "Osaka", country: "Japan" }
puts hash1.merge(hash2)
#{ :name => "Aiko", :age => 33, :city => "Osaka", :country => "Japan" }

delete(key): 刪除指定的 key&value。

hash = { name: "Aiko", age: 33 }
puts hash.delete(:age)
#{ :name => "Aiko" }

clear: 清空 hash 的所有 key&value。

hash = { name: "Aiko", age: 33 }
puts hash.clear
#{}

查詢

keys: 回傳所有的 key。是為陣列形式

hash = { name: "Aiko", age: 33 }
puts  hash.keys
#[:name, :age]

values: 回傳所有的值。

hash = { name: "Aiko", age: 33 }
puts  hash.values
#["Aiko", 33]

sizelength: 回傳 hash 中鍵值對的數量。

hash = { name: "Aiko", age: 33 }
puts hash.size
#2

fetch(key, default): 根據鍵索引值,如果鍵不存在則回傳預設值。

hash = { name: "Aiko", age: 33 }
puts hash.fetch(:gender, "Unknown") # 如果不存在"gender"键,回傳"Unknown"
#"Unknown"

select: 回傳符合條件的 key&value。

hash = { name: "Aiko", age: 33, city: "Osaka" }
puts hash.select { |key, value| value.is_a?(String) }
#{ :name => "Aiko", :city => "Osaka" }

reject: 回傳不符合條件的 key&value。

hash = { name: "Aiko", age: 33, city: "Osaka" }
puts hash.reject { |key, value| value.is_a?(String) }
#.is_a?(資料類型)是 ruby 裡的檢查 method
#{ :age => 33 }

檢查系列 return boolean

has_key?(key)&key?(key): 檢查是否存在指定的鍵。

hash = { name: "Aiko", age: 33 }
puts hash.has_key?(:name)
#true

has_value?(value)&value?(value): 檢查是否存在指定的值。

hash = { name: "Aiko", age: 33 }
puts hash.has_value?(33)
#true

empty?: 檢查 hash 是否為空。

empty_hash = {}
non_empty_hash = { name: "Aiko" }
puts empty_hash.empty?
puts non_empty_hash.empty?
#true
#false

直接大變

invert: 將 key&value 互換。

hash = { name: "Aiko", age: 33 }
puts hash.invert
#{ "Aiko" => :name, 33 => :age }

to_a: 將哈希轉換為包含 key&value 的陣列。

hash = { name: "Aiko", age: 33 }
puts hash.to_a
#[[:name, "Aiko"], [:age, 33]]

迭代

keys.each: 迭代所有的鍵。

hash = { name: "Aiko", age: 33 }
hash.keys.each do {|key| puts key}  
end
#:name
#:age

values.each: 迭代所有的值。

hash = { name: "Aiko", age: 33 }
hash.values.each do {|value| puts value }
end
#"Aiko"
#33

很好,下一篇我們來透過面試題,來更進一步了解 Ruby 吧!


上一篇
vol.08 如紅寶石般閃耀的您-Ruby 學習筆記 (四) array methods 20+ 選!
下一篇
vol.10 想當工程師? Ruby 必須掌握的面試題!#2023 持續更新
系列文
富士大顆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言