Eche un vistazo a la siguiente desviación al ejecutar exactamente el mismo código:
Rubí-3.0.2:
3.0.2 :001 > id = :id 3.0.2 :002 > puts id.to_proc.arity.abs 2
Rubí-2.7.4:
2.7.4 :001 > id = :id => :id 2.7.4 :002 > puts id.to_proc.arity.abs 1
Captura de pantalla para evidencia de ejecución: 2.7.4 vs 3.0.2
Usé 2.7.4. Sin embargo, cualquier 2.XX devuelve "1".
¿Se trata de algún tipo de problema de compatibilidad con BWD o de un cambio documentado? Gracias
La aridad de un método o proceso puede ser un valor positivo o negativo. Si es positivo, el método/proc acepta un número estático de argumentos con el número que representa el número de argumentos requeridos.
Si la aridad es negativa (como es el caso de esos procesos), el método/proc acepta un número variable de argumentos. El número devuelto le da la cantidad de argumentos requeridos como -1 - n siendo n la cantidad de argumentos requeridos.
Ahora, para el resultado de Symbol#to_proc , la aridad más correcta es -2 , ya que tiene que pasar un argumento (es decir, el receptor donde se llamará al método que representa el símbolo) más cualquier cantidad de argumentos adicionales (que se pasarán a lo largo de como argumentos de método).
En versiones anteriores de Ruby, el proceso devuelto se definía para aceptar cualquier número de argumentos, similar a lambda { |*args| ... } . Luego, el "cuerpo" del proceso verificó la cantidad de argumentos y planteó si había muy pocos argumentos.
Sin embargo, en Ruby 3.0, el proceso devuelto se define de forma similar a lambda { |receiver, *args| ... } Aquí, la interfaz del proceso deja más claro que hay un solo argumento requerido y cualquier número de argumentos opcionales.
El comportamiento del proceso en sí no cambió mucho (pero vea a continuación). Como en ambos casos, la implementación interna se optimizó en gran medida, ambas versiones verifican la cantidad de argumentos en el código C en la implementación del proceso y manejan los argumentos por sí mismos.
Sin embargo, con Ruby 3.0, el Proc devuelto es un lambda, ya que en realidad se comporta como un lambda en lugar de un proc con respecto al manejo de argumentos (y siempre lo ha hecho). Esto se cambió en https://bugs.ruby-lang.org/issues/16260 .
Como tal, el comportamiento en sí no ha cambiado, solo la interfaz anunciada se actualizó en Ruby 3.0 para reflejar mejor el comportamiento real del proceso.