- ¿Por qué se utilizan las llaves, no el método habitual entre paréntesis?
Algunas personas prefieren usar llaves cuando el parámetro es una función anónima. Por un lado, las llaves permiten que el patrón coincida con las funciones anónimas, mientras que los paréntesis no lo hacen. En este ejemplo particular, no hay necesidad de llaves.
He aquí un ejemplo en el que se requieren llaves (debido a la coincidencia de case
patrón):
def dotProd(v1:Row, v2:Row) =
v1.zip(v2).map{ case (a, b) => a * b }.reduceLeft(_ + _)
Tenga en cuenta que la función anterior logra el mismo que el de la pregunta, de una manera ligeramente diferente.
No, es un parámetro. Al igual que v1
y v2
son parámetros para dotProd
, t
es un parámetro para la función anónima que se pasa al map
.
Métodos en t
. El parámetro t
se definió como una tupla (específicamente, Tuple2[Double, Double]
, que puede ser escrita como (Double, Double)
), y tuplas le permiten extraer cada miembro de la tupla con métodos como que: _1
, _2
, _3
, etc.
A Tuple2
solo tiene _1
y _2
, por supuesto. Tenga en cuenta que el primer parámetro es _1
, no _0
, debido a la influencia de otros lenguajes funcionales.
De todos modos, el método zip
convertirá (List[Double]
) en un List[(Double, Double)]
. El método map
toma una función que convierte los elementos de la lista (que son (Double, Double)
tuplas) en algo más.
¿Son '._1' y' ._2' realmente los métodos de 'Tuple2'? Sabía que eran campos (como en 'TupleN' tendrá' N' campos de '_1' a' _N', cada ser de algún tipo 'Ti'. –
@TamoghnaChowdhury Claro, son métodos. Acceso a Scala prácticamente todo campos a través de métodos, a menos que estén declarados como 'privados [esto]'. –
¡Uy! Está absolutamente correcto. Las propiedades transparentes tienden a confundir a las personas utilizadas para acceder/modificadores explícitos en Java, como yo: P. Gracias por recordarme otra vez , aunque... –