En la lección 2 necesitamos escribir un programa que acepte uno o más números como argumentos de línea de comandos y luego imprimir la suma de esos argumentos.

Leccion-2 learnyounode Lección 2 – Baby Steps

Hmm….eso es difícil, especialmente si estás acostumbrado a usar JavaScript para aplicaciones de navegación.

Podría pasar un montón de tiempo investigando cómo construir aplicaciones de línea de comandos en NODE. Afortunadamente, no tienes que hacerlo.

Leccion-2 learnyounode Lección 2 – Baby Steps

Learnyounode nos da una gran pista para empezar.

La sugerencia nos dice que se puede acceder a los argumentos de la línea de comandos desde el objeto de proceso.

Leccion-2 learnyounode Lección 2 – Baby Steps

Una de las propiedades del objeto de proceso es argv, una matriz que contiene la lista completa de argumentos de la línea de comandos. Si lo desea, puede ver el contenido de process.argv creando un programa simple que contiene el código que sigue.

console.log(process.argv)

Puede ejecutar esto desde la línea de comandos de la misma manera que ejecutó su aplicación helloWorld.js desde la lección anterior.

$ learnyounode run program.js

Si ejecuta este código con un par de números pasados como argumentos, puede notar que esos argumentos se almacenan cómo cadenas en la propiedad process.argv.

$ nodo myProgram.js 1 2 3
$ [‘nodo’, ‘myProgram.js’, ‘1’, ‘2’, ‘3’]

La pista en learnyounode indica que podemos necesitar convertir estas cadenas en números para completar el ejercicio pasándolo al método Number(), o prependiéndolo con el operador unary +. Ah, eso es bastante simple después de todo. Aquí está la solución oficial en learnyounode que une todas las pistas.

Solución Oficial

[toggle title=’Click to show/hide solution’ border=’none’]

var resultado = 0
para (var i = 2; i < process.argv.length; i++)
resultado += Número(process.argv[i])
console.log(resultado)

[/toggle]

Note que el bucle en la solución oficial comienza en el índice de arreglo[2]. Si no lo hiciera, nos abofetearían con NaN en lugar de con la suma de nuestros argumentos porque la ruta al nodo y la ruta a tu programa son cadenas.

La solución oficial es realmente todo lo que necesitas para pasar la lección. Pero, no es la única manera de pasar la lección, y tiene un defecto que puede ser importante saber si usted desea construir sobre esta lección en el futuro.

Digamos que en lugar de pasar sólo números como argumentos, está pasando números y cadenas todos mezclados.

nodo babySteps-official.js 1 2 a 3
NaN

En lugar de obtener la suma de nuestros números, obtenemos NaN porque a es una cadena. La solución oficial sólo es válida si sólo pasas números como argumentos. Si desea pasar una combinación de tipos de datos, pero sólo sumar los números sin obtener NaN (no un número), tendrá que hacer su programa un poco más inteligente. Abajo está mi solución para el ejercicio de los pasos del bebé, que puede manejar una lista de argumentos tiene tipos de datos no numéricos.

Solución alternativa

var sum = process.argv.reduce(función (a, b, c) {
si (c >= 2 &&&!isNaN(b)) {
retorno +a + + +b
si no es así, si (c >= 2) {} si no lo es (c >= 2)
retorno +a + 0;
} más {
retorno 0;
}
})

console.log(sum)


En lugar de usar un bucle, estoy usando el método Array.prototype.reduce().

En mi función de devolución de llamada, a es el valor anterior, b es el valor actual y c es el índice.

Nótese que estoy adelantando a y b con el operador unary + para coaccionar los valores de cadena de process.argv en números. Una crítica a mi solución es que la posición de inicio del índice sigue estando codificada (c >= 2).

Técnicamente, sólo sumará una lista de argumentos que empiecen en el índice[2].

Para acceder a la propiedad process.argv, esto probablemente sea correcto, ya que index[0] es siempre la ruta al nodo, y index[1] es siempre la ruta a su programa. Sin embargo, necesitaría modificar esta solución si fuera a utilizarla para algo más que para acceder a la propiedad process.argv, donde el tipo de datos de índice[0] e índice[1] podría no ser conocido.

Reader Interactions

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Share This