LINUX.ORG.RU

Вся мощь rust. Генерация алфавита.

 ,


0

5

Вот я продолжаю эксперименты с rust. Мне нужно сгенерировать массив из символов A-Z, элегантным решением было бы воспользоваться диапазоном

for x in 'A'..'Z' {}
но для char не реализуем типаж iterator. при попытке его самого реализовать
impl Iterator for char {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        Some(self)
    }
}
выдает такую ошибку:
only traits defined in the current crate can be implemented for arbitrary types
Те получается для char это не реализуемо?

сделай type alias, тебе английским по консоли пишут, что для существующих типов ты можешь реализовывать только свои traits. Почему так сделано я уже не помню, было где-то написано.

upd: https://stackoverflow.com/questions/35160995/implement-foreign-trait-for-fore...

тайпальясом не обойдёшься походу, придётся свой тип городить.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Костыль и на юникоде сломается.

Он хочет навесить свою реализацию trait на тип. Ни то ни другое не его. Я помню, что это обсуждалось и решено было запретить, чтобы не дать возможности ломать семантику не своих типов, но где именно это обсуждалось - не помню.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 2)
Ответ на: комментарий от Dark_SavanT

Запретили из-за возможных конфликтов, если не ошибаюсь. В любом случае итерация по буквам опасна, ибо unicode != ascii и простой инкремент может выдать ерунду.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ага, а теперь вопрос - я по каким-то своим причинам хочу сделать range от 'Ⰰ'(U+2C00) до 'Ⱞ'(U+2C2E) как это идеоматично реализовать?

Dark_SavanT ★★★★★
()
for x in 'а' as u32..='я' as u32 {
        println!("{:?}", std::char::from_u32(x).unwrap());
}

Для ascii сгодится и:

for x in 'a' as u8..='z' as u8 {
        println!("{:?}", x as char);
}

Virtuos86 ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Почему так сделано я уже не помню, было где-то написано.

Емнип, это нарушает инкапсуляцию. Да и вообще трэш с расширением встроенных типов в стиле Ruby не нужен.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Я думаю мощь раста проявленная в данном конкретном примере не выйдет за пределы локалхоста ТС. Что касается допущения, так там в качестве результата Option, который без матчинга использовать, конечно, нельзя, кроме как в привет-мире.

Virtuos86 ★★★★★
()
Ответ на: комментарий от RazrFalcon

ну давайте так вопрос поставим:

Кто за то что чтобы просто использовать массив?

Loafter
() автор топика
Ответ на: комментарий от eao197

Нет, это стандартный синтаксис для диапазонов включительно. Раньше для этого хотели три точки использовать, но решили что легко ошибиться и лишнюю точку поставить, поэтому сделали ..=

pftBest ★★★★
()
Ответ на: комментарий от RazrFalcon

неа, я про составные символы с диакритикой например.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT
fn main() {
    let text = "сколько же чаров в символе?😀";
    let vec : Vec<char> = text.chars().collect();
    println!("{:?}", vec)
}

>>> ['с', 'к', 'о', 'л', 'ь', 'к', 'о', ' ', 'ж', 'е', ' ', 'ч', 'а', 'р', 'о', 'в', ' ', 'в', ' ', 'с', 'и', 'м', 'в', 'о', 'л', 'е', '?', '😀']
Aswed ★★★★★
()

Вся мощь rust откроется, если внимательно читать ругань компилятора. Он все подробно пишет.

https://doc.rust-lang.org/error-index.html здесь можно по индексу искать.

vlad9486
()
Ответ на: комментарий от Aswed

"..=" это просто часть макроса

… но синтаксис позаимствован от нового (стабилизирован с 1.25) синтаксиса указания диапазона

Virtuos86 ★★★★★
()

Не учись по примерам с ЛОРа. Серьёзные дядьки здесь не сидят, местные разве что говнокодить научат

anonymous
()
Ответ на: комментарий от anonymous

А где серьёзные дядьки сидят?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.