2017-02-27 3 views
2

Ich habe von den Vorteilen des Auswendiglernens gehört, aber ich bin mir nicht sicher, wie es funktioniert. Zum Beispiel in:Wie funktioniert Ruby Memoization?

class User < ActiveRecord::Base 
    def twitter_followers 
    # assuming twitter_user.followers makes a network call 
    @twitter_followers ||= twitter_user.followers 
    end 
end 

laut meinem Wissen ist @twitter_followers eine Instanzvariable und wird nur im Rahmen für eine Anforderung bleiben

I (so dass es von der Ansicht zugänglich sein wird.) Ich bin nicht sicher, ob derselbe Benutzer dieselbe Seite aktualisiert, ob er das zwischengespeicherte Ergebnis verwendet, anstatt die Abfrage auszulösen.

+0

Der Begriff ist "Memoisierung", BTW. –

Antwort

3

Sie können eine Instanz von User haben und user.twitter_followers Aufrufe an verschiedenen Orten haben.

Ohne memoization wird es bedeuten, neue twitter_user.followers Anfrage mit jedem Aufruf user.twitter_followers, während bei memoization nur einer Anforderung @twitter_followers Variable erfolgen und wird jeder konsequenter Rufaufbau verwenden.

So bin ich nicht sicher, ob der gleiche Benutzer wieder die gleiche Seite aktualisiert wird das zwischengespeicherte Ergebnis verwenden, anstatt die Abfrage von Brennen?

Mit der Seite aktualisieren wird es neue Anfrage sein.

In der Ansicht kann der Vorteil von Memoization verwendet werden, wie meine Antwort impliziert, wenn Sie beispielsweise innerhalb dieser einzelnen Seite mehr als einmal auf user.twitter_followers verweisen.

In Modellen/Dienstleistungen/Arbeiter/andere andere Backend-bezogene Orte mit Memoization macht wirklich den Unterschied.

+0

Also Auswendiglernen wird nicht anwendbar sein, wenn es eine neue Anfrage ist, oder? Das ist nur dann von Vorteil, wenn wir innerhalb einer Anfrage mehrere Aufrufe an dieselbe Sache haben. –

+0

@DeepakKumarPadhy ja, jede neue Anfrage == neue Anfrage an Twitter. Was ist eine gute Sache, wenn Sie aus Sicht des Benutzers darüber nachdenken;) –

+0

Vielen Dank für Ihre ziemlich klare Erklärung. –

1

Zuerst wird die Abfrage ausgelöst. Sie wird im Speicher als Instanzvariable der Instanz des Benutzermodells gespeichert. Die Instanz des Benutzermodells wird immer auf Anforderung neu geladen.