En el método inject
or reduce
, n
representa un valor acumulado; esto significa que el resultado de cada iteración se acumula en la variable n
. Esto podría ser, como en su ejemplo, la suma o producto de los elementos en la matriz.
yield
devuelve el resultado del bloque, que se almacena en n
y se utiliza en las siguientes iteraciones. Esto es lo que hace que el resultado sea "acumulativo".
a = [ 1, 2, 3 ]
a.sum # inject(0) { |n, v| n + v }
# n == 0; n = 0 + 1
# n == 1; n = 1 + 2
# n == 3; n = 3 + 3
=> 6
Además, para calcular la suma que también podría haber escrito a.reduce :+
. Esto funciona para cualquier operación binaria. Si su método se llama symbol
, escribir a.reduce :symbol
es lo mismo que escribir a.reduce { |n, v| n.symbol v }
.
attr
y la empresa son en realidad métodos. Bajo el capó, definen dinámicamente los métodos para ti. Utiliza el símbolo que pasó para calcular los nombres de la variable de instancia y los métodos. :member
da como resultado la variable de instancia @member
y los métodos member
y member =
.
La razón por la que no puede escribir attr_reader @member
es porque @member
no es un objeto en sí mismo, ni puede convertirse en un símbolo; en realidad le dice a ruby que busque el valor de la variable de instancia @member
del objeto self
, que, en el ámbito de clase, es la clase misma.
Para ilustrar:
class Example
@member = :member
attr_accessor @member
end
e = Example.new
e.member = :value
e.member
=> :value
Recuerde que el acceso a las variables de instancia no se ha establecido produce nil
, y dado que la familia attr
método acepta solamente símbolos, se obtiene: TypeError: nil is not a symbol
.
En cuanto al uso Symbol, puede tipo de usarlos como cadenas. Son excelentes claves hash porque los símbolos iguales siempre se refieren al mismo objeto, a diferencia de las cadenas.
:a.object_id == :a.object_id
=> true
'a'.object_id == 'a'.object_id
=> false
También son de uso común para referirse a los nombres de métodos y can actually be converted to Proc
s, que puede transmitirse a los métodos. Esto es lo que nos permite escribir cosas como array.map &:to_s
.
Consulte this article para obtener más interpretaciones del símbolo.