In Ruby sto cercando di capire tra i metodi to_enum
e enum_for
. Prima di me la mia domanda, ho fornito alcuni esempi di codice e due esempi per aiutare w/context.Differenze tra [1,2,3] .to_enum e [1,2,3] .enum_for in Ruby
Esempio:
# replicates group_by method on Array class
class Array
def group_by2(&input_block)
return self.enum_for(:group_by2) unless block_given?
hash = Hash.new {|h, k| h[k] = [] }
self.each { |e| hash[ input_block.call(e) ] << e }
hash
end
end
Esempio # 1:
irb (main)> puts [1,2,3].group_by2.inspect
=> #<Enumerator: [1, 2, 3]:group_by2>
Nell'esempio # 1: Chiamata group_by
sull'array [1,2,3]
, senza passare in un blocco, restituisce un enumeratore generata con il comando self.enum_for(:group_by_2)
.
Esempio # 2
irb (main)> puts [1,2,3].to_enum.inspect
=> #<Enumerator: [1, 2, 3]:each>
Nell'esempio # 2, l'enumeratore viene generato chiamando il metodo to_enum
sulla matrice [1,2,3]
Domanda:
fare enumeratori genera negli esempi 1 e 2, si comportano diversamente in alcun modo? Posso vedere dalle uscite ispezionate che mostrano etichette leggermente diverse, ma posso trovare qualche differenza nel comportamento degli enumeratori.
# Output for example #1
#<Enumerator: [1, 2, 3]:each> # label reads ":each"
# Output for example #2
#<Enumerator: [1, 2, 3]:group_by2> # label reads ":group_by2"
@ 7stud grazie. Volevo solo essere sicuro che non mi mancasse qualcosa. – amorphid
@amorphid, I documenti ruby erano abbastanza buoni nel dire: "Questo metodo è un sinonimo del metodo A. Vedi la descrizione per il metodo A." Preferirei vedere questo riferimento piuttosto che una descrizione duplicata. – 7stud
Ho appena riletto il tuo esempio e solo ora mi sono reso conto che si può anche fare '[1,2,3] .to_enum (: foo)', che restituisce '#' . Se l'avessi capito, la mia domanda sarebbe stata semplicemente => Il simbolo nel comando '[1,2,3] .to_enum (: foo)' ha uno scopo, diverso dalla sostituzione di ': each' con': foo' nell'output? La [docs per la classe Enumerator] (http://www.ruby-doc.org/core-2.1.2/Enumerator.html) non dice nulla a riguardo, almeno non che io possa vedere. –
amorphid