¿Por qué los bloques Ruby no se pueden almacenar directamente en variables?

Como usted dice, * puede * crear un Proc, que es un objeto que representa una pieza de código ejecutable (es decir, una función de primera clase). Cuando un método recibe un bloque, puede declarar un nombre para él en su firma, así:

def do_something (arg1, arg2 y block)
# hacer cosas
block.call
# hacer más cosas
fin

Cuando Ruby invoca este método, el bloque (si se da uno) se convierte en un objeto Proc y se asigna a la variable `block`.

Sospecho por su pregunta que ya comprende todo esto.

Parece que está haciendo la distinción entre un bloque , que es una referencia a un punto en el código y el cierre de su enlace, y un Proc , que es un objeto Ruby completo. La única diferencia significativa entre estos dos conceptos es que el segundo es un valor de Ruby (un objeto), mientras que el primero es solo una cosa en el nivel C subyacente. Un Proc es simplemente un bloque que se ha convertido en un valor y, por lo tanto, es asignable. Por lo tanto, no se puede asignar un bloque a una variable porque si pudiera, eso sería lo que llamamos un Proc.

Mi consejo sería no preocuparse por la distinción. Se supone que no le importa al desarrollador de Ruby, solo al implementador del lenguaje.