Создать калькулятор (JS)
У меня есть строчка, calc(2).add(3).add(5).res()и мне нужно написать решение, чтобы получить 10в результате. Я пробовал это
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())
но в моем случае я прохожу 2в new Calc(2), а не в calc(2). Как я могу это изменить?
Буду очень признателен за любую помощь!
Ответы
У вас может быть элегантное решение, использующее силу замыканий:
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}
`)
}
calcФункция принимает начальное число , называемое xи возвращает объект с двумя способами:
res()просто возвращает числоadd()примет параметрy, суммирует егоxиcalcснова вызовет результат.
Итак, ваш интерфейс полностью согласован: calc(10)он будет таким же, как calc(3).add(7)или calc(8).add(2)или calc(2).add(3).add(5). Вы можете связать addвызовы столько, сколько захотите, и это всегда будет одинаково. Звонок res()завершит цепочку и просто выдаст вам текущий номер calc- независимо от того, сделали вы это calc(10).res()или calc(2).add(3).add(5).res().
Код можно значительно сократить с помощью стрелочных функций:
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}
`)
}
По тому же шаблону можно легко добавить другие операции:
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}
`)
}
Обратите внимание: поскольку каждая операция выполняется немедленно, единственный приоритет, который у вас есть на данный момент, - это то, что идет первым.
Если я правильно понял, это был бы способ сделать это:
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())
Вы можете определить calcкак функцию, возвращающую объект 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())