2012-05-08 5 views
17

eine klassische Hallo Welt Beispiel aus ihrem doc,Warum ist Rack Antwort Körper ein Array keine Zeichenfolge?

class HelloWorld 
    def call(env) 
    return [200, {}, ["Hello world!"]] 
    end 
end 

meine Frage ist, warum der dritte Wert ist [Hallo Welt! "], Nicht "Hallo Welt"? Aus ihrer doc,

Die Körper muss auf jeden reagieren und müssen nur String-Werte ergeben. Die Körper selbst keine Instanz von String sein sollte, wie dies in Ruby 1.9 brechen.

Warum Körper braucht auf jeden antworten? und in welchem ​​Fall spielt es eine Rolle?

+0

Ich würde annehmen, dass es gepuffert werden kann und dann in Stücke an wen auch immer gesendet werden kann. Die Antwort kann ziemlich groß sein, so dass die Server es "streamen". ist Ihre Frage spezifischer für die Klausel über Ruby 1.9 als die gesamte Iteration über den Körper? –

+0

Es macht auch Sinn, wenn Sie darüber nachdenken, wie send() und recv() in der C-Welt arbeiten. Wenn Sie recv anrufen, geben Sie ihm eine Adresse für einen Puffer von Zeichen, die er füllt. Sie sind nicht sicher, den gesamten Körper in einem Anruf zu erhalten. Das gleiche gilt, wenn Sie eine Reihe von Zeichen senden. – nickethier

Antwort

8

Ich denke, Rack stammt aus Python Wsgi. Hier ist die Erklärung für Python: http://www.python.org/dev/peps/pep-3333/#buffering-and-streaming

+1

richtig. und wenn deine Komponente, die du dort eingibst, mehr tut, als ein vorgefertigtes Array von Strings zu senden, gibt dir Rack einen netten "aufzählbaren" Vertrag, um deinen Fortschritt in Chunks als Antwort auf 'each' zu melden. Während es für ein Hallo-Welt-Beispiel vielleicht albern aussieht, macht es viel mehr Sinn mit etwas realerem, wie eine Template-Engine, die unseren generierten HTML-Code ausspuckt, zum Beispiel –

+1

Link-only-Antworten werden abgeraten, da die Site, zu der Sie verlinken, abstürzen könnte Veränderung. Bitte schreiben Sie die wichtigen Punkte hier. –

6

Geht man von dem Satz The Body itself should not be an instance of String, as this will break in Ruby 1.9., würde ich davon ausgehen, dass das letzte Element der Antwort ein Enumerable sein muss. Seit String s gestoppt, einschließlich dieses Modul in 1.9, benötigen Sie eine Art von Sammlung, die es implementiert.

BTW: Hallo Welt Beispiele sind oft nicht gut für herauszufinden, warum etwas auf eine bestimmte Weise getan wird, sind sie zu trivial.