Как мы применяем int как BigInt в Dart 2? - PullRequest
0 голосов
/ 28 апреля 2018

Играя с классом BigInt в Dart 2 (версия Dart VM: 2.0.0-dev.50.0), я столкнулся со следующими проблемами:

BigInt x = 5;

print(x % 3); // 2
print(x ~/ 3); // 1

Пока все хорошо, но ...

Когда я пытаюсь получить доступ к методам, например:

print(x.pow(2));

Я получаю NoSuchMethodError: Класс 'int' не имеет метода экземпляра 'pow' исключение. Похоже, что x рассматривается как ароматизированный ванилью int ...

Далее, если я попытаюсь создать экземпляр x более явно:

var x = new BigInt.from(5);

Я получаю NoSuchMethodError: Класс 'int' не имеет получателя экземпляра '_used'.

Не понимаю ли я документации ? В частности, как мы можем привести int, как 5 или ['a', 'b', 'c'].length, как BigInt объект?

Редактировать: Хотя это не объясняет, почему BigInt x = 5, а затем такие выражения, как x % 3, не генерируют ошибок и работают, как ожидается, это, по-видимому, просто из-за того, что BigInt s и int s не воспроизводятся хорошо вместе Например, если x действительно представляет BigInt (в отличие от того, когда он создается с использованием BigInt x = 5, после которого x представляет обычный int), то выражение x % 3 не работает, потому что Для операции % ожидается BigInt справа, а 3 - нет. (Выражение должно измениться на неуклюжее x % new BigInt.from(3), чтобы избавиться от NoSuchMethodError: Класс 'int' не имеет метода получения экземпляра '_used' исключение.)

Как я уже говорил, это не все объясняет. Тот факт, что такие выражения, как BigInt x = 5 разрешены, и что выражения, такие как x % 3, работают тогда, как и ожидалось, говорит о том, что BigInt s и int s равны означали , чтобы работать без проблем, по крайней мере на некоторых дизайнерских работах ...

1 Ответ

0 голосов
/ 29 апреля 2018

Вы запускаете Dart в рабочем режиме Dart 1 и не тестируете свой код с помощью анализатора. Это означает, что вы не проверяете тип, и ваша программа действительно не является корректной. Литерал 5 - это не BigInt, это int. Вы присваиваете его переменной, типизированной как BigInt, но в рабочем режиме Dart 1 тип переменной игнорируется, так что «успешно». BigInt s и int s не предназначены для безупречной совместной работы, но если вы на самом деле не проверяете типы, вы не узнаете, что используете неправильный тип.

Ваше исправление, var x = new BigInt.from(5);, верно. Дарт не делает неявного преобразования, вы должны явно создать BigInt, чтобы получить его. Это также означает, что вы должны сделать:

var x = new BigInt.from(5);
print(x % new BigInt.from(3)); // 2 

Этот код должен работать. так что, если он выбрасывает, что-то не так. Я попробовал код в Dart 2.0.0-dev.49.0, и он работал. Какую версию Dart вы используете (dart --version) и как вы ее используете?

Если вы запустите свою программу как dart --checked program.dart, вы получите ошибку типа при попытке присвоить int переменной BigNum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...