2015-11-24 32 views
0

我有日期的哈希:行爲的陣列#拒絕和陣列#地圖iterater

values = {a: Time.now, b: Time.now - 3.days} 
# => {:a=>2015-11-24 22:35:56 +0900, :b=>2015-11-21 22:35:56 +0900} 

要選擇其日期在一天之內從現在的價值觀,我寫道:

values.reject{|i, v| v < Time.now - 1.day} 
# => {:a=>2015-11-24 22:35:56 +0900} 

當我使用i[1],而不是v,不工作,

values.reject{|i| i[1] < Time.now - 1.day} 
# => NoMethodError: undefined method `<' for nil:NilClass 

而與map,它的工作原理。

values.map{|i| i[1]} 
# => [2015-11-24 22:35:56 +0900, 2015-11-21 22:35:56 +0900] 

爲什麼Array#reject的行爲不同?

+3

代碼中沒有數組。 –

+0

您改爲使用Hash.reject。我猜關鍵和價值是綁定到不同的變量。因此,數組的參數銷燬不起作用。 – sschmeck

回答

1

http://ruby-doc.org/core-2.2.3/Hash.html#method-i-reject

Hash#reject產生的鍵和值的塊。 i只是關鍵。你的鑰匙是符號;假設陣列存取器(i[1])在符號上返回nil

Hash#map是不是一個東西,我猜。您可能獲得Enumerable#mapHash是一個Enumerable,所以你仍然可以在散列上調用map

http://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-map

Enumerable#map正在產生從散列每個鍵 - 值對作爲2元件陣列:[:a, 2015-11-24 22:35:56 +0900]

順便說一句在許多語言散列被稱爲關聯數組。 Rubyists通常稱它們爲哈希值。

1

rejectHash上的一種方法,該方法採用帶有兩個塊變量的塊:鍵和值。如果你只有一個變量傳遞它的模塊,像這樣:

some_hash.reject{|x| ...} 

然後x將被分配的關鍵,而其對應的價值是無法訪問的。做x[1]調用符號方法[]x,它給出nil,因爲:a:b只有一個字符長。

另一方面,Enumerable#map將哈希隱式轉換爲數組,並將一個塊包含一個塊變量。如果實際與一個變量傳遞給它一個塊,像這樣:

some_hash.map{|x| ...} 

然後x將是有一個鍵 - 值對的數組。做x[1]調用數組方法[],並返回哈希的值。

如果改爲傳遞一個塊具有兩個變量,像這樣:

some_hash.map{|x, y| ...} 

然後破壞將被隱式地應用到調整的變量的數目,即,現場大概會被解釋爲:

some_hash.map{|(x, y)| ...} 

xy會嚴格地是鍵和值。

也許你很困惑,因爲Array#reject只有一個變量塊,並與Hash#reject不同。