2 Stimmen

Ruby Array in Hash von Schlüssel-Wert-Paaren umwandeln, wobei der Wert eine Konstante ist

Ich arbeite mit einer Ruby-API, die eine Reihe von booleschen Schalter, etwas entlang der Linien von nimmt:

validate({ :can_foo => true, :can_bar => false, :can_baz => true, ... })

Ich schreibe eine Reihe von Tests, um zu überprüfen, ob sich die API so verhält, wie sie sollte, also muss ich eine Menge von Schaltern konstruieren. Es erschien mir verschwenderisch, die ganze Zeit :foo => true einzugeben, also dachte ich mir, ich schreibe ein kleines Ruby-Kleinod, um ein Array in diese Struktur zu konvertieren, z.B.

true_vals  = %w( these are my true  items )
false_vals = %w( these are my false items )

convert  = lambda{ |arr, truthiness| arr.inject({}){ |res, key| res.update(key=>truthiness) } }
falsify  = lambda{ |arr| convert.call(arr, false) }
truthify = lambda{ |arr| convert.call(arr, true)  }

validate( truthify.call(true_vals).merge( falsify.call(false_vals) ) )

Ist das besser, als einfach eine lange Liste von :sym => [true|false] Paaren abzutippen? Gibt es eine bessere Möglichkeit, dies zu tun?

(Ich begann mit true_vals.inject({}){ |res, key| res.update(key=>true) }, aber das fühlt sich nicht DRY genug; Ich müsste copy-paste & s/true/false/, um die falschen zu tun; und ich tue es viele viele Male, so dass ein Lambda sinnvoll erscheint)

Danke,

-- Matt

4voto

Victor Moroz Punkte 8971
cs = {  true =>   [:y, :yes], 
        false =>  [:n, :no] }
Hash[cs.map{ |k, vs| vs.map{ |v| [v, k] } }.flatten(1)]
#=> {:y=>true, :yes=>true, :no=>false, :n=>false}

1voto

Linuxios Punkte 33049

Hier ist eine Lösung:

switches={}
true_vals.each do |v|
    switches[v]=true
end
false_vals.each do |v|
    switches[v]=false
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X