2016-03-29 10 views
0

Dieser Code funktioniert:Gibt es eine sauberere, kürzere, eingebaute Möglichkeit, Elemente in Rubin iterierbar zu verpacken?

permission.class.ancestors.include?(Enumerable) ? permission : [permission] 

Der Inhalt in permission kann entweder durch ein Symbol oder jede Sequenz (beispielsweise ein Array). Wenn ein einzelnes Element übergeben wird, wird es in ein Array eingeschlossen.

Gibt es eine Methode, die das schon macht? (Kann in 2.2.2 entweder Ruby-Built-In sein oder von Rails 4.2.0 hinzugefügt werden).

Antwort

1

Ja, scheint es, wie Sie die Array.wrap() Erweiterung sind beschreiben in in Rails von Active zur Verfügung gestellt (active_support/core_ext):

>> list = ['a', :b, /c/] 
=> ["a", :b, /c/] 

>> Array.wrap(list) 
=> ["a", :b, /c/] 

>> map = {"a" => :foo, b: :bar, /c/ => 'baz'} 
=> {"a"=>:foo, :b=>:bar, /c/=>"baz"} 

>> Array.wrap(map) 
=> [{"a"=>:foo, :b=>:bar, /c/=>"baz"}] 

>> Array.wrap(:symbol_literal) 
=> [:symbol_literal] 

Sie die Dokumentation finden Sie hier: http://apidock.com/rails/Array/wrap/class. Die Array(...) Verfahren im Kern Ruby-Bibliothek hat ein ähnliches Verhalten, sondern um einen Hashwert zu einem verschachtelten Array konvertieren:

>> Array(list) 
=> ["a", :b, /c/] 

>> Array(map) 
=> [["a", :foo], [:b, :bar], [/c/, "baz"]] # Probably not what you want 

>> Array(:symbol_literal) 
=> [:symbol_literal] 

Die Dokumentation in der oben angegebenen Link enthält eine umfassendere Erläuterung der Array.wrap() vs Array()

Verwandte Themen