我在我的 ruby?? 代碼中得到以下輸入哈希
my_hash = { include: 'a,b,c' }
(或者)
my_hash = { includes: 'a,b,c' }
現在我想要最快的方法來獲得'a,b,c'
我目前使用
def my_includes
my_hash[:include] || my_hash[:includes]
end
但這非常慢,因為它總是先檢查 :include 關鍵字,然后如果失敗,它將尋找 :includes。我多次呼叫這個函式,這個散列中的值可以不斷變化。有什么辦法可以優化和加速這個嗎?我不會得到任何其他關鍵字。我只需要支持:include 和:includes。
uj5u.com熱心網友回復:
注意事項和注意事項
首先,一些警告:
- 您標記了這個 Rails 3,所以您可能使用的是一個非常舊的 Ruby,它不支持許多優化、較新的與哈希相關的方法呼叫,如#fetch_values或#transform_keys!,或結構化資料的模式匹配。
- 您可以使用 Hash 查找來做各種事情,但假設您可以確定始終只有一個鍵或另一個鍵,它們都不會比布爾短路更快。
- 您沒有顯示任何呼叫代碼,因此如果沒有基準測驗,很難看出這個操作在任何一般意義上如何被認為是“慢”的。
- 如果您正在使用 Rails 而不是在尋找純 Ruby 解決方案,您可能需要考慮ActiveModel::Dirty僅在屬性發生更改時才采取行動。
使用記憶
不管上述情況如何,您在這里可能缺少的是某種形式的記憶,因此您不需要每次通過任何讓您感覺很慢的回圈都不斷地重新評估鍵并提取值。例如,您可以存盤 Hash 評估的結果,直到需要重繪 :
attr_accessor :includes
def extract_includes(hash)
@includes = hash[:include] || hash[:includes]
end
然后,您可以根據需要從范圍內的任何位置呼叫#includes或#includes=(或直接使用@includes實體變數),而無需重新評估散列或鍵。例如:
def count_includes
@includes.split(?,).count
end
500.times { count_includes }
棘手的部分基本上是知道是否以及何時更新您的記憶值。基本上,您應該只在從 ActiveRecord 或遠程 API 之類的地方獲取新哈希時呼叫 #extract_includes。在此之前,您可以重復使用存盤的值,只要它仍然有效。
uj5u.com熱心網友回復:
您可以使用具有兩個鍵:include和:includes相同值的修改后的哈希:
my_hash = { include: 'a,b,c' }
my_hash.update(my_hash.key?(:include) ? { includes: my_hash[:include] } :
{ include: my_hash[:includes] })
#=> {:include=>"a,b,c", :includes=>"a,b,c"}
my_hash如果您對多個操作使用相同的哈希,這可能是最快的。但是,如果在幾次詢問后生成了一個新的哈希,您可能會看到在構造哈希時是否可以包含兩個:include鍵:includes。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/485000.html
上一篇:如何訪問Hanami連接實體
