:value當我們有帶有可選嵌套物件之一的物件時,如何使用靜態鍵()提取值?
message_obj = {
'id': 123456,
'message': {
'value': 'some value',
}
}
callback_obj = {
'id': 234567,
'callback': {
'value': 'some value',
}
}
在這種情況下,我使用下一條指令:
some_obj[:message] ? some_obj[:message][:value] : some_obj[:callback][:value]
如何從嵌套物件中提取值,然后我們知道可接受的物件名稱串列(例如。[:message, :callback, :picture, ...])。在父物件中只存在一個嵌套物件。
uj5u.com熱心網友回復:
我會使用Hash#values_at然后選擇value回傳的一個哈希:
message
.values_at(*[:message, :callback, :picture, ...])
.compact
.first[:value]
uj5u.com熱心網友回復:
你可以使用挖掘
例如:
message_obj = {
'id': 123456,
'message': {
'value': 'some message value',
}
}
callback_obj = {
'id': 234567,
'callback': {
'value': 'some callback value',
}
}
objects = [message_obj, callback_obj]
objects.each do |obj|
message_value = obj.dig(:message, :value)
callback_value = obj.dig(:callback, :value)
puts "found a message value #{message_value}" if message_value
puts "found a callback value #{callback_value}" if callback_value
end
這將列印:
找到一個訊息值 某個訊息值
找到一個回呼值 某個回呼值
dig 的好處是路徑可以是任意長度,例如下面的也可以。
objects = [message_obj, callback_obj]
paths = [
[:message, :value],
[:callback, :value],
[:foo, :bar],
[:some, :really, :long, :path, :to, :a, :value]
]
objects.each do |obj|
paths.each do |path|
value = obj.dig(*path)
puts value if value
end
end
uj5u.com熱心網友回復:
將 Ruby 的模式匹配功能與哈希一起使用
這是使用Ruby 3 的模式匹配特性的絕佳機會。其中一些特性是在 Ruby 2.7 系列中作為實驗性引入并經常更改的,但大多數現在已經穩定并被認為是核心語言的一部分,盡管我個人預計它們將繼續增長和改進,尤其是當它們更多大量采用。
雖然仍在不斷發展,但 Ruby 的模式匹配允許您執行以下操作:
objects = [message_obj, callback_obj, {}, nil]
objects.map do
case _1
in message: v
in callback: v
else v = nil
end
v.values.first if v
end.compact
#=> ["some message value", "some callback value"]
您只需為要匹配的每個 Hash 鍵定義一個案例(使用頂級鍵非常容易;對于深度嵌套的鍵有點困難),然后將它們系結到像v這樣的變數。然后,您可以在模式匹配 case 陳述句內部或外部使用您喜歡的任何方法對系結變數進行操作。在這種情況下,由于所有模式都系結到v ,因此在找到v的任何實體上呼叫我們的方法更有意義在您的示例中,每個 :value 鍵都有一個值,因此我們可以只使用 #first 或 #pop得到我們想要的結果。v.values
我添加了一個 else 子句來設定v以避免NoMatchingPatternError,并在事件 that 中添加一個 nil 守衛v == nil,但否則這非常簡單、緊湊且非常可擴展。由于我希望模式匹配,尤其是基于哈希的模式,在 Ruby 3 系列中繼續發展,這是探索該功能并采取相當可讀和可擴展的方法的好方法,否則可能需要更多回圈和驗證,或使用第三方 gem 方法,如Hashie#deep_find。你的旅費可能會改變。
注意事項
從 Ruby 3.1.1 開始,在深度嵌套的鍵上使用查找模式的能力有些受限,并且在使用替代語法時使用變數系結當前會引發例外。由于這是核心中的一個相當新的功能,請留意Ruby 主分支的更新日志(是的,未來的讀者,在撰寫本文時,該分支仍被標記為“主”)或即將發布的發行說明Ruby 3.2.0 預覽版及更高版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/455829.html
上一篇:Python-列印創建物件時呼叫了哪些dunder方法
下一篇:計算相等的正則運算式匹配
