有沒有辦法快速檢查哈希是符號還是字串作為鍵?
uj5u.com熱心網友回復:
你可以使用#all?檢查哈希的鍵是否都是符號,如下所示:
hash = { foo: 1, bar: 2, baz: 3 }
hash.all? { |key, _value| key.is_a?(Symbol) }
#=> true
uj5u.com熱心網友回復:
TL;博士
具有單級鍵的平面哈希可以很容易地被查詢,但嵌套資料結構不能。此外,哈希鍵不僅限于字串或符號鍵。您幾乎可以使用任何 Ruby 物件作為哈希鍵,但需要注意物件必須使用哪些方法#respond_to?才能正常發揮鑰匙的作用。
使用#keys.all?
如果您的 Hash 不是嵌套資料結構,那么您可以簡單地詢問 Hash 是否其所有頂級鍵都是 Symbol 物件:
p {foo: 1, bar: 2, baz: 3}.keys.all? Symbol
#=> true
如果您想檢查相反的內容,只需替換Symbol為。String
但是,如果您有嵌套的資料結構,那么您必須遍歷每個鍵和值來對每個鍵進行符號化或字串化。您可以使用Hashie之類的 gem 來執行此操作,或者在 JSON 之間來回往返 Hash 以將符號強制轉換為字串(默認)或在序列化或決議期間執行其他物件轉換。例如,對于 Ruby 3.1.2:
require "json"
hash = {foo: {bar: 1, baz: 2 }}
hash = JSON.parse hash.to_json
hash
#=> {"foo"=>{"bar"=>1, "baz"=>2}}
將確保您的所有鍵都轉換為字串物件,或者如果它們不能明智地轉換為字串,則會引發例外。您還可以傳遞其他選項來強制執行不同的行為,包括根據需要支持各種內置或自定義JSON 添加。也可以使用 YAML 或 Marshal 進行往返,盡管如果您的 Hash 中有污染或用戶提供的物件,這些通常不如標準 JSON 安全。
uj5u.com熱心網友回復:
你可以寫下以下內容。
def key_type(h)
case h.each_key.map(&:class).uniq
when [String] then String
when [Symbol] then Symbol
else nil
end
end
key_type('cats'=>9, 'dogs'=>2) #=> String
key_type(:cats=>9, :dogs=>2) #=> Symbol
key_type('cats'=>9, :dogs=>2) #=> nil
key_type(:cats=>9, 'dogs'=>2) #=> nil
key_type(9=>'cats') #=> nil
key_type(9=>'cats', 2=>'dogs') #=> nil
key_type({}) #=> nil
例如,如果
h = { 'cats'=>9, 'dogs'=>2 }
然后
a = h.each_key.map(&:class)
#=> [String, String]
b = a.uniq
#=> [String]
所以String回傳。相比之下,如果
h = { 'cats'=>9, :dogs=>2 }
然后
a = h.each_key.map(&:class)
#=> [String, Symbol]
b = a.uniq
#=> [String, Symbol]
所以nil回傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494156.html
下一篇:計數字符和字串nC
