Здравствуйте, kaa.python, Вы писали:
C>>Надо лучше начать добавлять поддержку в IDEA KP>О даа! Очень бы хотелось иметь такую поддержку! Vim + Sublime – это, безусловно, прекрасно, но для популяризации языка среди не юниксоидов IDE жизненно необходима.
Я честно думаю начать делать как только язык более-менее подойдёт к версии 1.0. Мы делали поддержку в IDEA для нашего языка, получалось совсем несложно — можно попробовать ещё раз.
Здравствуйте, Cyberax, Вы писали:
C>Я честно думаю начать делать как только язык более-менее подойдёт к версии 1.0. Мы делали поддержку в IDEA для нашего языка, получалось совсем несложно — можно попробовать ещё раз.
Версия 1.0 должна быть ближе к концу осени, насколько я понимаю планы "растовцев". Пиши тут, как начнете, постараюсь подключиться.
Данное приведение типов создавалось с оглядкой на стандартные перечисления из языка Си. При этом, значения входящие в перечисление в Си, как впрочем и в Rust, не должны идти последовательно, одно за другим. Поэтому, объявляем перечисление TestData приводимым при помощи FromPrimitive (1) и делаем две конверсии, одну для существующего в перечислении значения 1 (2), а вторую для не существующего значения 2 (3). В консоли у нас окажется, как и ожидалось:
Some(Val2), None
А теперь к твоему примеру с "x as MyType". В твоем примере предполагается, что все конверсии должны проходить успешно. Но что делать, если конверсия не удалась и нам вернулся None из примера выше (3)? Попытка "добыть" значение из None приведет к следующим последствиям:
val2.unwrap();
task '<main>' failed at 'called `Option::unwrap()` on a `None` value'
В то время как гарантировать преобразование от числового значения к нашему типу мы не можем.
Здравствуйте, cl-user, Вы писали:
CU>Тогда ещё вопрос: почему в примерах используется именно такая запись:
let val1: Option<MyType> = FromPrimitive::from_int(1);
вместо
let val1 = MyType.from_int(1);
Ведь так несколько короче. Или они не равноценны?
Запись вида "MyType.from_int(1)" предполагает что делается вызов функции from_int применительно к объекту (именно объекту, а не типу) MyType, а у тебя такого объекта нет.
Вот засада, а так написать и не получается... Т.е. from_int "привязана" к FromPrimitives, а не к MyType? Как же тогда написать FromPrimitive::from_int(1) внутри выражения, чтобы оно вернуло именно MyType? Т.е. как его "типизировать"?
Здравствуйте, kaa.python, Вы писали:
KP>Ага, в Rust-стиле: add_int, add_uint и т.д.
Ок. Появились ещё вопросы:
1. Взаимозаменяемость функций и замыканий есть или нет? получаю сообщения
mismatched types: expected `fn(int) -> f32` but found `|int| -> f32` (expected extern fn but found fn)
mismatched types: expected `|int| -> f32` but found `fn(int) -> f32` (expected fn but found extern fn)
Как-нибудь можно привести одно к другому?
2. Не могу вставить в структуру замыкание: получаю "missing lifetime specifier" — что с этим делать?
CU>1. Взаимозаменяемость функций и замыканий есть или нет? получаю сообщения CU>
mismatched types: expected `fn(int) -> f32` but found `|int| -> f32` (expected extern fn but found fn)
CU>mismatched types: expected `|int| -> f32` but found `fn(int) -> f32` (expected fn but found extern fn)
CU>Как-нибудь можно привести одно к другому?
Полагаю что нет, т.к. Rust довольно придирчев к типам данных, при этом замыкание и функция имеют разные типы. Больше того, на уровне ядра языка для распределния памяти для замыкания используется специальная функция. Так что я думаю что без вариантов.
CU>2. Не могу вставить в структуру замыкание: получаю "missing lifetime specifier" — что с этим делать?
Добавить спецификацию времени жизни для замыкания, скороей всего
Здравствуйте, kaa.python, Вы писали:
KP>А вообще, лучше бы ты код того что пытаешься сделать привел.
рано ещё
Задолбался с разными типами указателей на строку
Вот так нельзя: 'struct S1 { name: &str }' — "missing lifetime specifier", а на кой он мне?
Вот так можно: 'struct S1 { name: ~str }' — Ok
Теперь надо в функции создать структуру и передать имя в сишную функцию:
fn f1(_name: &str) {
let s = S1 { name: _name }; // так нельзя, надо ~str а не &str
...
name.with_c_str(|s| ... // так можно, но если тип параметра функции изменить на ~str, то опять получим ошибку
Вот перепробовал уже 48 вариантов, но ни как не могу получить из &str -> ~str или ~str -> &str
Из-за большой ломки в версии 0,9 большая часть мануалов в сети "не совсем точна". Плюс к этому сам str какой-то очень особый тип
CU>Вот перепробовал уже 48 вариантов, но ни как не могу получить из &str -> ~str или ~str -> &str
Таки я бы начал с чтения документации Смотри: &str – ссылка на "какую-то строку". Эта строка может быть размещена на стеке, в локальной куче или куче обмена, т.е. компилятор не имеет ни малейшего представления о том, что ты передал и ожидает некой подсказки. Так как все эти 3 хранилища разделены физически, тебе необходимо сделать явное преобразование, как в примере ниже:
struct S1 { name: ~str }
fn foo(name: &str) {
let val = name.into_owned();
let s = S1 { name: val };
}
Вот так всегда, опять поторопился...
С ~str всё работает, просто значение надо клонировать перед повторным использованием, о чём компилятор недвусмысленно и сообщает
Здравствуйте, kaa.python, Вы писали:
KP>Вообще, я тебя обманул, функции и замыкания вполне себе взаимозаменяемые, и в действительности просто ключевое слово в очередной раз переименовали
Спасибо! Сейчас попробую. Я видел в доках proc, но меня смутило, что такое замыкание может вызываться "единожды". Или имелось в виду — только в одном месте?
KP>struct S1 { name: ~str }
KP>fn foo(name: &str) {
KP> let val = name.into_owned();
KP> let s = S1 { name: val };
KP>}
KP>
ааааа, into_owned()!!!... пойду ещё раз гляну документацию
И сразу ещё вопрос:
внутри функции создаю структуру и передаю указатель на неё в сишную либу (а-ля регистрация клбэков):
После завершения этой функции rcs дропнется? Судя по аварийному завершению при попытке в другой функции восстановить структуру из пришедшего указателя, это так.
Как "заморозить" структуру?
Пытаюсь создать static вектор верхнего уровня модуля для "хранения" подобных структур — не получается Как?!
Здравствуйте, cl-user, Вы писали:
CU>}[/code] После завершения этой функции rcs дропнется? Судя по аварийному завершению при попытке в другой функции восстановить структуру из пришедшего указателя, это так. CU>Как "заморозить" структуру?
Ожидаемо. Ты вышел и скоупа f1, количество ссылок на rcs стало равным нулю. Попробуй хранить ее где-то выше.