我正在嘗試(實際上成功了,但我不明白它是如何作業的)為我的模型中的哈希撰寫自定義方法(我正在研究 Ruby on Rails 6)。
我的哈希看起來像這樣
my_hash = {
[['name_1', 'slug_1']=>value_1],
[['name_2', 'slug_2']=>value_2],
[['name_1', 'slug_1']=>value_3],
[['name_2', 'slug_2']=>value_4]
}
所以基本上是陣列的散列。您會注意到“鍵”是重復多次但具有不同值的陣列。我想要實作的是撰寫一個自定義方法,該方法僅將所有鍵“加入”一個鍵中,該方法將分配一組值,因此基本上我應該能夠獲得:
my_hash = {
['name_1', 'slug_1']=>"values": [value_1, value_3],
['name_2', 'slug_2']=>"values": [value_2, value_4]
}
為此,我有這段代碼,我多次使用它:
my_hash.inject({}) do |hash, record|
# each record has the following format => [["unit_name", "axis.slug"]=>average_value(float)]
keys, value = record
# now keys has ["unit_name", "axis.slug"] and values equals average_value
hash[keys.first] ||= {}
hash[keys.first][keys.last] = value.to_f
hash
end
由于我多次使用這個,我想撰寫一個自定義方法,所以我做了:
def format_hash_data my_hash
my_hash.inject({}) do |hash, record|
# each record has the following format => [["unit_name", "axis.slug"]=>average_value(float)]
keys, value = record
# now keys has ["unit_name", "axis.slug"] and values equals average_value
hash[keys.first] ||= {}
hash[keys.first][keys.last] = value.to_f
hash
end
end
并像這樣使用它:my_hash = format_hash_data(my_hash)沒有成功(它拋出一個錯誤,說“format_hash_data”不是該類的有效方法)。
所以我擺弄了一下,并在方法的名稱中添加了“self”,留下:
def self.format_hash_data my_hash
my_hash.inject({}) do |hash, record|
# each record has the following format => [["unit_name", "axis.slug"]=>average_value(float)]
keys, value = record
# now keys has ["unit_name", "axis.slug"] and values equals average_value
hash[keys.first] ||= {}
hash[keys.first][keys.last] = value.to_f
hash
end
end
令我驚訝的是,它在使用時完美無缺 my_hash = format_hash_data(my_hash)
我真的不明白為什么添加“自我”會使我的代碼有效,也許任何人都可以解釋一下?我嘗試使用諸如send()或instance_evalfirst 之類的東西,將代碼片段作為一種方法(類似于my_hash.instance_eval(my_method))發送到實際的哈希,但我無法讓它作業。
對于冗長的解釋,我很抱歉,我希望我足夠清楚,以便你們中遇到同樣困境的任何人都能理解。提前致謝。
uj5u.com熱心網友回復:
預先計算self.方法名使它成為一個類的方法,而不是一個實體方法。如果您不確定其中的區別,您應該查找它,因為它是正確定義和使用類和方法的基礎。
作為類方法,您可以將其用作:
my_hash = MyHash.format_hash_data(my_hash)
或者,如果您在類的范圍內,只需my_hash = format_hash_data(my_hash),這就是它在您的情況下使用self.前置(類方法定義)作業的原因。
如果要將其定義為實體方法(為實體定義的方法),則可以像這樣使用它:
my_hash = my_hash.format_hash_data
并且定義將使用self實體的隱式:
def format_hash_data
self.inject({}) do |hash, record|
# each record has the following format => [["unit_name", "axis.slug"]=>average_value(float)]
keys, value = record
# now keys has ["unit_name", "axis.slug"] and values equals average_value
hash[keys.first] ||= {}
hash[keys.first][keys.last] = value.to_f
hash
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314948.html
標籤:红宝石轨道 红宝石 散列 ruby-on-rails-6
上一篇:Railsparams方法:為什么可以像哈希一樣訪問它?
下一篇:元編程和參考
