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