2017-08-22 4 views
1

Si je modifie un tableau dans .tap contexte, la version modifiée sera retourné:Pourquoi l'égalité des tuyaux ne fonctionne pas avec tap dans Ruby?

states = [:a, :b].tap do |sts| 
    sts << :c 
end 

puts states # [:a, :b, :c] 

Mais si je modifie avec |=, il retourne le même objet:

states = [:a, :b].tap do |sts| 
    [[:a, :c], [:b, :d]].each do |type| 
    sts |= type 
    end 

    puts sts.inspect # [:a, :b, :c, :d] 
end 

puts states.inspect # [:a, :b] 

pourrait me diriger dans la bonne direction?

Répondre

2

Pourquoi est-ce?

Simple, car vous ne modifiez pas l'original sts. Vous créez à la place un nouveau tableau (à partir de l'opérateur |=) et faites sts point à ce nouveau tableau. Bien sûr, dès que le bloc tap revient, ce tableau temporaire est perdu pour toujours.


Si vous ne saviez pas,

sts |= type 

est un raccourci pour

sts = sts | type 
1

De la documentation:

tap {| x | block} → obj

Renvoie le résultat au bloc, puis revient à lui-même. L'objectif principal de cette méthode est de "puiser" dans une chaîne de méthodes, afin d'effectuer des opérations sur des résultats intermédiaires dans la chaîne.

Dans le premier cas, vous modifiez le tableau transmis et il est donc modifié.

que vous venez de créer en second cas, un nouveau tableau:

a = [1, 2] # => [1, 2] 
b = a 
b |= [3] 
a # => [1, 2] 
b # => [1, 2, 3] 
+0

Pourquoi je pense que, le « bruit »? Comment ça aide à démontrer quoi que ce soit, je me demande honnêtement? [Voici comment je le formater] (https://pastebin.com/raw/xU8hcx7J), par exemple. Cleaner __and__ copy-pastable. –

+0

ok, donc vous parlez de formatage, j'accepte votre point –

+0

ouais, désolé si je n'étais pas clair. Évidemment, je ne parlais pas du code. Juste le bruit :) –