2012-05-08 9 views
17

un clásico ejemplo del mundo hola de su doc,¿Por qué el cuerpo de respuesta en rack es una matriz, no una cadena?

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

mi pregunta es ¿por qué el tercer valor es [¡Hola mundo! "], No "Hola mundo"? Desde su doc,

El cuerpo debe responder a cada uno y sólo debe ceder valores de cadena. El cuerpo en sí no debe ser una instancia de String, ya que esto va a romper en Ruby 1.9.

por qué las necesidades corporales para responder a cada uno? y en que caso importa?

+0

Supongo que puede ser almacenado y enviado en trozos a quien lo solicite. La respuesta puede ser bastante grande para que los servidores la "transmitan". ¿Es su pregunta más específica para la cláusula sobre Ruby 1.9 aparte de la iteración completa sobre el cuerpo? –

+0

También tiene sentido cuando piensas cómo funcionan send() y recv() en el mundo C. Cuando llamas a recv le das una dirección a un buffer de caracteres que llena. No está seguro de obtener todo el cuerpo en una sola llamada. Lo mismo es cierto cuando envía una serie de caracteres. – nickethier

Respuesta

8

Creo que la cremallera se originó en python's wsgi. Aquí está la explicación de pitón: http://www.python.org/dev/peps/pep-3333/#buffering-and-streaming

+1

derecha. y cuando su componente que se queda ahí hace algo más que enviar un conjunto de cadenas preconstruidas, Rack le ofrece un buen contrato enumerable para informar su progreso en fragmentos en respuesta a cada uno. Si bien puede parecer tonto para un ejemplo de hello world, tiene mucho más sentido que algo más real, como un motor de plantillas escupiendo nuestro HTML generado, por ejemplo, –

+1

. Se desalientan las respuestas de enlace porque el sitio al que se está enlazando podría desaparecer o cambio. Por favor escribe los puntos importantes aquí. –

6

A juzgar por la sentencia The Body itself should not be an instance of String, as this will break in Ruby 1.9., me gustaría asumir que el último elemento de la respuesta tiene que ser un Enumerable. Dado que String s dejó de incluir este módulo en 1.9, necesitará algún tipo de colección que lo implemente.

Por cierto: hola ejemplos del mundo a menudo no son geniales para averiguar por qué algo se hace de cierta manera, son demasiado triviales.

Cuestiones relacionadas