寫了「從哈希刪除名爲產品」的方法
這樣做有它的短方法,但拍攝的清晰,我想出了這樣的:
products = {124 => ['shoes', 59.99], 352 => ['shirt', 19.99], 777 => ['pants', 19.87],
667 => ['jacket', 39.99], 898 => ['shoulder_holster', 22.78]}
def wipeProduct(hash, nameToDelete)
hash.each do |i|
key = i[0]
productName = i[1].first
hash.delete(key) if productName==nameToDelete
end
end
puts products.inspect
wipeProduct(products,'pants')
puts products.inspect
wipeProduct(products,'shoulder_holster')
puts products.inspect
bash-3.2$ ruby prod.rb
{352=>["shirt", 19.99], 898=>["shoulder_holster", 22.78], 667=>["jacket", 39.99], 777=>["pants", 19.87], 124=>["shoes", 59.99]}
{352=>["shirt", 19.99], 898=>["shoulder_holster", 22.78], 667=>["jacket", 39.99], 124=>["shoes", 59.99]}
{352=>["shirt", 19.99], 667=>["jacket", 39.99], 124=>["shoes", 59.99]}
我不知道這是否是可能的「褲子」,在多個地方哈希發生,但因爲我用「hash.each(......)」,該方法wipeProduct(哈希,nameToDelete)將測試永遠y哈希條目。
輸入類型的錯誤,以及如何解決它
當你把輸入你指定你捕獲d的字符串。這裏的證明:
irb(main):010:0> d = gets.to_s
12
=> "12\n"
irb(main):011:0> d.class
=> String
您可以在字符串轉換爲一個Fixnum這樣的:
irb(main):012:0> d.to_i
=> 12
irb(main):013:0> d.to_i.class
=> Fixnum
在產品散列的所有按鍵均Fixnums。這裏的證明:
irb(main):014:0> products.keys.each {|i| puts i.class}
Fixnum
Fixnum
Fixnum
Fixnum
Fixnum
=> [352, 898, 667, 777, 124]
所以,你需要捕捉值與該行的說法:
d = gets.to_i # Get value for argument
答案的缺失部分:
從產品,您可以用此編程刪除褲子條目:
products.delete(777)
運行它得到你:
您提供的關鍵值(在這種情況下777)到.delete()和它返回分別由以該順序的鍵和值的陣列
irb(main):003:0> products.delete(777)
=> ["pants", 19.87]
通知。
另一個實現
我不知道這是否是安全的。多數民衆贊成遍歷散列中的鍵值對塊修改散列。如果不是,你可以攢起來要刪除的所有鍵和遍歷哈希後刪除它們:
def wipeProduct(hash, nameToDelete)
keysToDelete = []
hash.each do |i|
key = i[0]
productName = i[1].first
keysToDelete << key if productName==nameToDelete
end
keysToDelete.each {|key| hash.delete(key) }
end
btw感謝所有的信息傢伙肯定有幫助,而不是拉出頭髮 – Matt 2009-11-06 05:05:10