Waves developers Ru
А если реально нужен цикл на произвольное число элементов, это тоже можно сделать в райд при помощи рекурсии
Читать полностью…Например, есть массив из 1000 разных целых чисел (в строке), перемешанных рандомно. И тебе надо заменить число 513 на 123. Можно сгородить фолд на 1000 элементов, а можно сделать красиво через makestring(split(.., "513"), "123")
Читать полностью…Тут нужен баланс, сложность скрипта или функции DApp рассчитывается исходя из максиально длинного пути выполнения, делая 100 получим большую сложность, которая не будет испльзоваться по факту. В больших скриптах это может стать проблемой, так как есть ограничение на сложность
Читать полностью…Ухты, я думал накладные расходы остануться, тогда пусть будет 100 ) Спасибо, попробую.
Читать полностью…нет, Ride ленивый язык, он не будет делать лишних итераций 🙂
Читать полностью…FOLD хочет знать верхнюю границу, она же понятна на этапе проектирования?
Читать полностью…Я понимаю как преобразовать число в строку, мой вопрос был про значения в List'е.
Вы имели в виду адаптер, что-то типа такого?
func mapIntToStr(accum: List[String], next: Int) = next.toString() :: accumЧитать полностью…
func mapStrToInt(accum: List[Int], next: String) = next.parseIntValue() :: accum
@Callable(i)
func Test() = {
let arr = [1,2,3]
let arrStr = FOLD<size(arr)>(arr, [], mapIntToStr)
let str = makeString(arr, "|")
let arrStr2 = split(str, "|")
let arrNum = FOLD<size(arrStr2)>(arrStr2, [], mapStrToInt)
([])
}
Подскажите, как правильно сохранить в данных контракта массив (List[Int]) чисел?
В документации для 6‑й версии ride нет метода для хранилища которым бы можно было сохранить List[Int], я нашел makeString и split, но они для строк.
отличный пример, но он про другое мне кажется. Как в конкретной задаче склеить 37 чисел в строку через разделитель и потом обратно разобрать можно ручками сделать проще?
Читать полностью…FOLD это не цикл, это макрос иммитирующий работу в цикле. Поэтому что ручками самому писать, что FOLDом разницы нет, а FOLDом проще
Читать полностью…А лучше спроектировать так, чтоб не приходилось использовать циклы вообще, т.е. работать прямо со строкой
Читать полностью…FOLD завершится обработав ровно переданное количество элементов, он так устроен.
Читать полностью…Если прейдёт значение 1, то 36 итераций будет пустым, тогда уже лучше выкинуть ошибку, если size != аргумент с размером массива
Читать полностью…ну как так то? какое-то же огрнаичение сверху должно быть?
Читать полностью…Т.е. передать с фронта еще один аргумент с размером? Тогда фронт сможет при reveal манипулировать длинной сохраненного списка.
Логика сейчас такая:
commit
- Сохраняем массив чисел в строку с разделителями и записываем в данные
reveal
- Поучаем строку и переводим в List[String] (назовем Х)
- List[String] через map в FOLD List[Int]
т.е. если в Х 6 значений, а в аргументе reveal прислали 5 - FOLD проигнорирует последнее.
У меня эти значения приходят с фронта, может быть разная длинна, просто вынес в Test для явности.
Читать полностью…Как тогда правильно написать кусочек кода выше?
Читать полностью…Если да, то тут выходит загвоздка с size, хоть он и отдает Int, FOLD видимо хочет константу и выдает ошибку. В примерах документации также FOLD используется с заранее известными значениями.
Читать полностью…Вообщем-то все так и делают, преобразовывают числа в строки, а потом соединяют в одну через разделитель. При вычитывании данных, обратное преобразование.
У типа Int есть функция toString(), а к строке можно применить функции parseInt() или parseIntValue().
Читать полностью…
let i = 10
let s = i.toString()
let ii = s.parseIntValue()
i == ii
Прикольно, toInt() всегда возвращает число, кратное 1000
Читать полностью…