Вопрос №4868 от пользователя Катерина Шевцова в уроке «Рациональные числа», курс «JS: Составные данные»
доброго вечера!
/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20
return pair('car');
^
TypeError: pair is not a function
at car (/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20:10)
at Object.toString (rational.js:10:33)
at Object.<anonymous> (test.js:14:12)
не совсем понимаю, что значит пара не является функцией . какая именно пара?!... вот код:
export const make = (x, y)=> cons(x, y);
export const numer =(d)=> car(d);
export const denom =(d)=> cdr(d);
export const toString =(d)=> `${car(d)} / ${cdr(d)}`;
export const isEqual =(x, y)=> {
if(car(x)*cdr(y)===car(y)*cdr(x)){return true}
else {return false}
};
export const add = (x, y)=> {
return (car(x)*cdr(y)+car(y)*cdr(x))/(cdr(x)*cdr(y));
};
export const sub = (x, y)=> {
return (car(x)*cdr(y)-car(y)*cdr(x))/(cdr(x)*cdr(y));
};
export const mul = (x, y)=> {
return (car(x)*car(y))/(cdr(x)*cdr(y));
};
export const div = (x, y)=> {
return (car(x)*cdr(y))/(cdr(x)*car(y));
};
отладочная печать не помогла, хотя возможно я как то не так использую ее в абстракциях..
Во первых, вы не пользуетесь абстракциями. Вы это нигде не используете:
export const make = (x, y)=> cons(x, y);
export const numer = (d) => car(d);
export const denom = (d) => cdr(d);
Во вторых, результатом математических операций над рациональными числами должны быть тоже рациоанльные числа, а у вас числовой результат.
сделано! все равно так же ругается(
export const make = (x, y)=> cons(x, y);
export const numer =(dr)=> car(dr);
export const denom =(dre)=> cdr(dre);
export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`};
//console.log(toString);
export const isEqual =(x, y)=> {
if(numer(x)*denom(y)===numer(y)*denom(x)){return true}
else {return false}
};
export const add = (x, y)=> {
return make(numer(x)*denom(y)+numer(y)*denom(x)), (denom(x)*denom(y));
};
export const sub = (x, y)=> {
return make(numer(x)*denom(y)-numer(y)*denom(x)), (denom(x)*denom(y));
};
export const mul = (x, y)=> {
return make(numer(x)*numer(y)), (denom(x)*denom(y));
};
export const div = (x, y)=> {
return make(numer(x)*denom(y)), (denom(x)*numer(y));
};
Что именно теперь пишет?
make: Entering directory `/usr/src/app'
babel-node --presets=es2015 test.js
/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20
return pair('car');
^
TypeError: pair is not a function
at car (/usr/local/lib/node_modules/hexlet-pairs/dist/index.js:20:10)
at numer (rational.js:6:28)
// export const numer =(dr)=> car(dr);
at Object.toString (rational.js:10:41)
// export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`};
at Object.<anonymous> (test.js:14:12)
// rational.toString(rational.add(rat1, rat2)),
Посмотрите на последнюю строчку из этого трейса:
at Object.<anonymous> (test.js:14:12)
строка 14 - посмотрите какая операция там тестируется. скоее всего эта операция возвращает не пару. возможно у вас там скобки лишние.
assert.equal(
rational.toString(rational.add(rat1, rat2)),
rational.toString(rational.make(25, 6))
);
да! спасибо!! скобки были лишние в add!
но почему в тесте была отсылка к toString? эта функция ведь не имеет отношения к ошибке..
at numer (rational.js:6:28)
// export const numer =(dr)=> car(dr);
at Object.toString (rational.js:10:41)
// export const toString =(d)=> {return `${numer(d)} / ${denom(d)}`};
at Object.<anonymous> (test.js:14:12)
// rational.toString(rational.add(rat1, rat2)),
это особенность динамических языков програмирования. ошибки проявляются в момент выполнения кода. и место, в котором ошибка проявилась совсем не обязательно будет совпадать с местом, где эта ошибка допущена.
ваша функция toString
уверена в том, что ей в качестве аргумента будет передана пара, но add
возвращала совсем не пару. поэтому при попытке выполнить car
на не паре return pair('car');
, возникала ошибка pair is not a function
.
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







