Crear calculadora (JS)
Tengo una línea calc(2).add(3).add(5).res()y necesito escribir una solución para que tenga 10como resultado. Intenté esto
class Calc{
constructor(num){
this.num = num
}
add(a){
this.num += a;
return this;
}
res() {
return this.num;
}
}
let calc = new Calc(2)
console.log(calc.add(3).add(5).res())
pero en mi caso yo paso 2en new Calc(2), no en calc(2). ¿Cómo puedo cambiarlo?
¡Estaré realmente agradecido por cualquier ayuda!
Respuestas
Puede tener una solución elegante que aproveche el poder de los cierres:
function calc(x) {
return {
res: function() {
return x;
},
add: function(y) {
return calc(x + y)
}
}
}
test(
10,
calc(10).res()
);
test(
10,
calc(3).add(7).res()
);
test(
10,
calc(8).add(2).res()
);
test(
10,
calc(2).add(3).add(5).res()
);
function test(expected, actual) {
console.log(
`result is: ${actual} correct: ${actual === expected}
`)
}
La calcfunción toma el número inicial llamado xy devuelve un objeto con dos métodos:
res()solo devuelve el númeroadd()tomará un parámetroy, lo sumaráxycalcvolverá a llamar con el resultado.
Entonces su interfaz es completamente consistente: calc(10)será la misma que calc(3).add(7)o calc(8).add(2)o calc(2).add(3).add(5). Puedes encadenar las addllamadas tanto como quieras y siempre será lo mismo. Llamar res()terminará la cadena y solo le dará el número que calctiene actualmente, ya sea que lo haya hecho calc(10).res()o calc(2).add(3).add(5).res().
El código se puede acortar mucho usando las funciones de flecha:
const calc = x => ({
res: () => x,
add: y => calc(x + y)
});
test(
10,
calc(10).res()
);
test(
10,
calc(3).add(7).res()
);
test(
10,
calc(8).add(2).res()
);
test(
10,
calc(2).add(3).add(5).res()
);
function test(expected, actual) {
console.log(
`result is: ${actual} correct: ${actual === expected}
`)
}
También se pueden agregar fácilmente otras operaciones usando el mismo patrón:
const calc = x => ({
res: () => x,
add: y => calc(x + y),
sub: y => calc(x - y),
mul: y => calc(x * y),
div: y => calc(x / y)
});
test(
2,
calc(5).add(5).mul(2).sub(4).div(8).res()
// (((5 + 5) * 2) - 4) / 8 =
// ((10 * 2) - 4) / 8 =
// (20 - 4) / 8 =
// 16 / 8 = 2
);
function test(expected, actual) {
console.log(
`result is: ${actual} correct: ${actual === expected}
`)
}
Tenga en cuenta que, dado que cada operación se ejecuta de inmediato, la única prioridad que tiene actualmente es lo que viene primero.
Si entendí correctamente, esta sería una forma de hacerlo:
class Calc{
constructor(num){
this.num = num
}
add(a){
this.num += a;
return this;
}
res() {
return this.num;
}
}
let calc = function(num){ return new Calc(num) }
console.log(calc(2).add(3).add(5).res())
Puede definir calccomo función que devuelve el objeto Calc.
class Calc{
constructor(num){
this.num = num
}
add(a){
this.num += a;
return this;
}
res() {
return this.num;
}
}
const calc = (input) => new Calc(input);
console.log(calc(2).add(3).add(5).res())