[英]Why can we use array indexing in the block to hash sort in ruby?
我可以對下面的哈希進行排序:
h = {"a"=> 20, "b"=> 30 , "c" => 25}
通過使用這個:
h.sort { |a, b| b[1] <=> a[1] }
但是,我不明白為什么或如何使用此代碼。 |a, b|
a
和b
表示的值是什么 它們來自哪里?
sort
方法的文檔對這些問題保持沉默。
Hash
類從Enumerable
模塊繼承其sort
方法。 可枚舉狀態的文檔:
Enumerable
mixin為集合類提供了多種遍歷和搜索方法,並具有排序功能。 該類必須提供each
方法,它產生集合的連續成員。
所以對方法的實現Enumerable
依靠each
類的方法Enumerable
被包括在具體的,它預期each
將產生對象表示集合的成員。 在這種情況下, Hash#each
的文檔都說:
each {| key, value | block } → hsh
對hsh中的每個鍵調用一次,將鍵值對作為參數傳遞。
由於Hash#each
產量key, value
在散列每個鍵-值對,在這些方法中Enumerable
假定key, value
是一個在基礎散列(在某種意義上說,它是)“集合的成員”。 因此, Enumerable#sort
產生key, value
為a
,和不同的key, value
為b
,因為Enumerable#sort
是依靠由得到的值Hash#each
其實施。 這就是你的例子中a
和b
的來源。
Hash從Enumerable模塊中獲取其sort
方法,其中記錄為返回數組。
如果要以特定順序訪問哈希值,則對哈希進行排序,允許Ruby將其轉換為數組數組,並使用這些數據以所需順序提取值及其關聯鍵:
h = {"a"=> 20, "b"=> 30 , "c" => 25}
sorted_values = h.sort_by{ |k,v| v } # => [["a", 20], ["c", 25], ["b", 30]]
sorted_values.each do |k, v|
puts "#{v} <= #{k}"
end
# >> 20 <= a
# >> 25 <= c
# >> 30 <= b
為什么Ruby將哈希鍵/值對轉換為子數組對我來說很有意義。 我曾經想過要對哈希進行排序的唯一原因是以特定順序訪問值並保留子數組所做的鍵和值的映射。
注意:我正在使用sort_by
因為在挖掘結構或計算中間排序值而不是sort
時,它更快。 這個特殊的用例可能不是最好的例子,因為哈希非常簡單,但是我的大多數現實例子最終都不得不深入sort_by
相當深的和sort_by
規則。
這些都記錄在哪里? 事實並非如此。 Hash的文檔沒有提到繼承自Enumerable的sort
或sort_by
。 有關sort
和sort_by
Enumerable文檔雖然很好,但僅指的是對Array進行排序的情況。 學習哈希被分解為鍵/值對然后傳入來自經驗,它應該被記錄,現在可以是你承擔的任務。 暗示。 暗示。
Enumerable模塊的文檔提到:
該類必須提供每個方法,它產生集合的連續成員。
如果我們在沒有塊的散列上調用它們,則會產生一個Enumerator對象。 通過調用next來給出的連續值是鍵值對的數組。
h = {"a"=> 10, "b"=> 20, "c"=> 30}
h_enum = h.each
p h_enum.next #=> ["a", 10]
p h_enum.next #=> ["b", 20]
sort方法適用於這些對象,因此我們可以使用像[1]和b [1]這樣的術語進行比較
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.