2009-11-05 3 views
0

다른 해시 값을 호출하기위한 구문을 이해하려고 노력 중입니다. 예를 들어 내가 어떻게 이런 일에 대한 인수를 설정 가야합니까 '바지'를 삭제하는 것을 시도하고 말할 수 :해시 메소드 인수 값

products = {124 => ['shoes', 59.99], 352 => ['shirt', 19.99], 777 => ['pants', 19.87], 
667 => ['jacket', 39.99], 898 => ['shoulder_holster', 22.78]} 

내가 삭제 중 또는 그 이전에 오류 검사를 포함하고있어이 해시하는 메뉴 구동 프로그램을 작성하는 동안 키를 추가하는 것은이 내가 지금까지 무엇을 가지고 :

if a == 3     # Loop delete a Product 
puts "Delete a Product" 
d = gets.to_s # Get value for argument 

    while products.has_value?( d + syntax for right here???? )!= true do 
    puts "This turned out false because product does not exsist!" 
    d = gets.to_s 
    end 

puts "Congrats your out of the loop" 
products.delete(d + again syntax problems ????) 
puts products 

내가 어디에 바지를 삭제하면 내가 인수에 대해 구문을 입력하려면 어떻게합니까. ([d, : number])이 시나리오에서 삭제하거나 추가하는 방법과 관련하여 온라인 리소스와 관련하여 운이 좋지 않을 것입니다. 어떤 도움이나 코드 예제는

매트 A는 "해시에서라는 이름의 제품을 삭제"쓰기

답변

1

사용자가 ID 번호 또는 "바지"이름을 입력하는지 여부에 따라 다릅니다.

if a == 3     # Loop delete a Product 
    puts "Delete a Product" 
    d = gets # Get value for argument 

    until products.has_key?(d.to_i) 
    puts "This turned out false because product does not exsist!" 
    d = gets 
    end 

    puts "Congrats your out of the loop" 
    products.delete(d.to_i) 
    puts products 
end 

은 "바지"만약

가, 다음이 당신이 그것을하고 싶은 방법은 다음과 같습니다 : 전자의 경우

if a == 3     # Loop delete a Product 
    puts "Delete a Product" 
    d = gets.strip # Need to strip because otherwise the newline will wreck it 

    until products.find {|key, val| val.first == d} 
    puts "This turned out false because product does not exsist!" 
    d = gets.strip 
    end 

    puts "Congrats your out of the loop" 
    products.delete_if {|key, val| val.first == d} 
    puts products 
end 
1

방법을, 감사하겠습니다

이 그 일의 짧은 가지가 있지만 명확성을 위해 촬영 전 함께했다 이 :

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)

는 당신이 얻을 실행이 :

당신이 (.delete하기) (이 경우 777에서) 키 값을 제공하고 각각 순서대로 키와 값으로 구성된 배열을 반환
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 
2
products.to_a.select {|a| a.last.first == 'pants' } 

합니다.

[[777, ["pants", 19.87]]] 

그래서 나는 당신이 다음 루프에

while !products.to_a.select {|a| a.last.first == d }.empty? 

원하는 레코드를 삭제 소개 Dafydd의 라인을 사용하는 것 같아요.

def wipeProduct(hash, nameToDelete) 
    hash.reject!{|key,value| nameToDelete==value.first} 
end 

가 거부 :

1

다음은 "바지"항목을 삭제하는 깔끔한 방법입니다! 블록은 각 키 - 값 쌍을보고, true를 반환하면 제공된 키 - 값이 해시에서 제거됩니다.

0
if a == 3     # Loop delete a Product 
puts "Delete a Product by its key number" 
d = gets 
while products.has_key?(d)!= false do 
    puts "You have selected a key that is not currently in use" 
    d = gets 
end 
puts "You have deleted" 
products.delete(d) 
puts products 
end 

이 내가 몇 가지 문제까지 있었다 일을 결국 무엇인가 그래서 어떤 이유로 든 새로 입력 한 키를 받아 들일 수 없기 때문에 while 루프가 바뀌 었습니다.

+0

btw 모든 정보 담당자가 머리를 꺼내는 데 도움이됩니다. – Matt