Pregunta

métodos Por ejemplo, siempre he visto denominan String#split, pero nunca String.split, que parece un poco más lógico. O tal vez incluso String::split, porque usted podría considerar #split estar en el espacio de nombres de String. Incluso he visto el método solo, cuando la clase se asume / implícita (#split).

Yo entiendo que esta es la forma de identificar métodos de RI. ¿Qué fue primero?

¿Es esto para diferenciar, por ejemplo, métodos de campos? También he oído que esto ayuda a los métodos de instancia diferencia de los métodos de la clase. Pero ¿de dónde este comienzo?

¿Fue útil?

Solución

La diferencia indica cómo se accede a los métodos.

métodos de clase utilizar el separador :: para indicar que el mensaje puede ser enviado a la clase de objeto / módulo, mientras que métodos de instancia utilizar el separador # para indicar que el mensaje puede ser enviado a un objeto de instancia.

Me voy a tomar la clase Complex (en Ruby 1.9) para demostrar la diferencia. Tiene tanto Complex::rect y Complex#rect. Estos métodos tienen diferentes aridad y sirven propósitos completamente diferentes. Complex::rect toma una real y un argumento imaginario, el retorno de una nueva instancia de Complex, mientras Complex#rect devuelve una matriz de los componentes real e imaginaria 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 Ruby hacer esto, de hecho me veo como un inconveniente de convenciones otros idiomas, para ser honesto.

Además, esto es algo de un tema totalmente sin relación de campos porque todos los mensajes que puede enviar son mensajes, hablando con propiedad, incluso si miradas como un campo de acceso público . Lo más parecido que tiene que campos son atributos o variables de instancia, por supuesto, que siempre llevan el prefijo @ y no son directamente accesible desde el exterior de la instancia a no ser que esté utilizando herencia o Object#instance_variable_get / _set.

En cuanto a por qué eligieron específicamente :: y #? :: tiene sentido para mí, ya que los espacios de nombres separados convencionalmente, pero # era probablemente sólo un símbolo que no se utilizó en otra nomenclatura y sin ambigüedad podría ser reconocido como un separador de ejemplo- método.

Otros consejos

  

Yo entiendo que esta es la forma de identificar métodos de RI. ¿Qué fue primero?

Sí, esto es de donde vino. Cuando se utiliza #, que hipervínculos automáticamente sus métodos, por lo que las referencias a otros métodos de documentación comenzó a ser precedido por el signo #. Ver aquí

  

Los nombres de las clases, archivos fuente, y cualquier nombre de los métodos que contienen un subrayado o precedidas por una almohadilla, se enlazará automáticamente de texto del comentario a su descripción.

No se puede invocar un método realmente de esta manera, sin embargo. Pero eso no debería ser sorprendente; después de todo, <cref ...> es una instrucción no válida en C # a pesar de ser una etiqueta de documentación válida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top