2017-10-31 3 views
0

Hier ist ein hash:Wie trimmen Sie alle Leerzeichen in Hash-Taste?

hash = {"<start>"=>[["<intro>"]], 
     "<intro> "=>[["<FirstSentence>", "<Funnel>", "<Thesis>"]], 
     "<FirstSentence> "=>[["<StartingClause>", "<Group>", "<PastAction>", "."], ["<Quotation>", "--", "<Author>", "<QuoteEnd>", "<QuoteTransition>", "."]]} 

key[1] und key[2] hier einen weißen Raum nach > haben. Ich möchte das löschen. Ich habe versucht, tr(' ', ''), delete(' '), strip, gsub usw.

hash.each do |key, _| 
    key.delete(' ') 
end 

Aber sie funktionieren nicht. Leerraum ist immun gegen alle Methoden zum Abschneiden/Löschen. Benutze ich die Methode falsch?

+0

Möglicherweise müssen Sie den Hash z. B. neu erstellen. 'p hash.keys.map (&: strip) .zip (hash.values) .to_h'. Ich bin mir nicht sicher, ob Sie die Schlüssel einfach erneut eingeben können. –

Antwort

1

Die von Ihnen verwendete Schleife funktioniert nicht, da Ihr Code im Wesentlichen den Whitespace aus der Variablen key und nicht den Hashwert selbst löscht.

Was ich tun würde, ist eine Funktion schreiben, die die Schleife Logik kapselt und gibt einen neuen Hash mit den Tasten verändert, wie folgt aus:

def normalize_keys!(hash) 
    buffer = {} 
    hash.each do |key, value| 
    buffer[key.strip] = value 
    end 
    buffer 
end 

new_hash = normalize_keys!(old_hash) 
2
hash.each_with_object({}) { |(k,v),h| h[k.strip] = v } 
    #=> {"<start>"=>[["<intro>"]], 
    # "<intro>"=>[["<FirstSentence>", "<Funnel>", "<Thesis>"]], 
    # "<FirstSentence>"=>[["<StartingClause>", "<Group>", "<PastAction>", "."], 
    #      ["<Quotation>", "--", "<Author>", "<QuoteEnd>", 
    #       "<QuoteTransition>", "."]]} 
3
hash.map { |k, v| [k.strip, v] }.to_h 
0

Verfahren anzuwenden ist delete!, nicht delete. String # delete ändert den Empfänger nicht. Zeichenfolge # löschen! tut.

Verwandte Themen