La diferencia indica cómo acceder a los métodos.
métodos de clase utilizan el separador ::
para indicar que el mensaje puede ser enviado a la clase de objeto/módulo, mientras que métodos de instancia utilizan el separador de #
para indicar que el mensaje puede ser enviado a un objeto de instancia.
Voy a elegir la clase Complex
(en Ruby 1.9) para demostrar la diferencia. Tiene ambos Complex::rect
y Complex#rect
. Estos métodos tienen diferente arity y sirven propósitos completamente diferentes. Complex::rect
toma un argumento real y otro imaginario, devolviendo una nueva instancia de Complex
, mientras que Complex#rect
devuelve una matriz de los componentes real e imaginario de la instancia.
ruby-1.9.1-p378 > x = Complex.rect(1,5)
=> (1+5i)
ruby-1.9.1-p378 > x.rect
=> [1, 5]
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do?
ArgumentError: wrong number of arguments(2 for 0)
from (irb):4:in `rect'
from (irb):4
from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'
creo que la razón por la que no utilizan .
como separador de todo es que sería ambigua si el método pertenece a una clase o una instancia. Ahora que estoy acostumbrado a que Ruby haga esto, en realidad lo veo como un inconveniente para las convenciones de otros idiomas, para ser honesto.
Además, esto es algo de un tema totalmente sin relación de campos porque todos los mensajes se pueden enviar mensajes son, propiamente hablando, incluso si se ve como un campo de acceso público. Lo más parecido que tiene a los campos son atributos o variables de instancia, por supuesto, que siempre llevan el prefijo @
y no son directamente accesibles desde fuera de la instancia, a menos que esté usando herencia o Object#instance_variable_get
/_set
.
En cuanto a por qué eligieron ::
y #
? ::
tiene sentido para mí porque separa convencionalmente espacios de nombres, pero #
fue probablemente solo un símbolo que no se usó en otra nomenclatura y podría reconocerse inequívocamente como un separador de método de instancia.
Quiero saber por qué esta convención no se menciona/explica en libros/tutoriales cuando se discuten las convenciones de nomenclatura de ruby. Me pareció confuso ver los nombres de métodos con el prefijo '#' en varias discusiones y solo poder adivinar qué significado tenía el prefijo. El hecho de que '#' comience un comentario en la fuente .rb lo hace doblemente confuso. Como se puede imaginar, no es lo más fácil de buscar, así que gracias por haber preguntado esto en algún lugar pude tropezar con él. Me pregunto si podré encontrarlo de nuevo cuando olvide estos detalles en 6 meses de actividad sin rubí ... –