collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

Autor Tópico: StringUtils - Easy to use Strings in Rust  (Lida 1376 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline blabla

  • Mini Robot
  • *
  • Mensagens: 257
StringUtils - Easy to use Strings in Rust
« em: 19 de Maio de 2022, 22:37 »
Boa noite a todos,

Github:

SubStrings Slices and Random String Access in Rust
https://github.com/joaocarvalhoopen/SubStrings_Slices_and_Random_String_Access_in_Rust


Ontem à noite estive para aqui a pensar no que poderia fazer de engraçado para facilitar o uso de strings em Rust para o iniciante, ou então para aqueles projetos simples em que se quer só desenhar ou implementar rapidamente um algoritmo de manipulação de strings. Isto, pois as Strings em Rust estão bem implementadas como é óbvio, mas o Rust não esconde nenhuma da inacreditável complexidade do Unicode quando representado no esquema de codificação UTF-8. Em UTF-8, um caracter pode ser representado por 1 byte, 2, 3 ou 4 bytes e depois ainda para alguns menos usados ainda pode ser representado como a concatenação de dois caracteres de 4 bytes "e" e "'" podem alguns casos representar o "é" tal como o caracter único "é".

Depois ainda existem muitos caracteres de controlo e de mudança da direção da escrita a meio de um texto e tudo mais.

Depois como em UTF-8 um caracter pode ser representado por bytes de tamanho variável, e como o Rust é como o
Código: [Seleccione]
C++ é para duros heheheh eu digo sempre isto a brincar, espero que ninguém se ofenda, pois não é essa a minha intenção. Então, não se pode aceder aleatoriamente a um caracter, isto, sem que se tenha de percorrer a string toda do incio ao fim, por exemplo com um iterador ou num ciclo FOR e ir indo vendo onde estão as fronteiras dos caracteres, ou seja onde começa e onde acaba um caracter na byte String. Pois a indexação é ao byte, ali em baixo, em low level, junto ao ferro! Se se indexar aleatoriamente obtemos um fantástico Panic! que até ficamos a ver mal de uma vista! hehehehehhe

Por isso tudo, isto demora algum tempo a aprender e a perceber como se pode usar. O mais simples seria se em Rust houvesse uma simples "classe" / "tipo de dados", em que cada caracter de uma String ocupa-se um pouco mais e que fosse representado por 4 bytes como um unsigned int de 32, uint32 em C ou u32 em Rust. Mas para isso o Rust já tem o tipo de dados do "char". Que é isso mesmo é um u32 por baixo de 4 bytes. Então podemos por e simplesmente usá-lo dentro de um Vector que em Rust se chama Vec e que se designa parametrizado com o char por
Código: [Seleccione]
Vec<char>. Vector de chars. Ou seja uma lista de chars em Python. Funcionando assim como uma String do Python!

É pedir muito? Não é pedir muito pois não?

O problema é que esse tipo apesar de ter muitos métodos tem poucos métodos de conversão fácil de e para
Código: [Seleccione]
Strings e &str e &[char], este ultimo é um slice de chars. Tudo coisas muito fixolas e bacanas, e boas ferramentas para a nossa caixa de ferramentas.

Contudo como tem poucos métodos de Strings, dava jeito que existisse alguém que implementasse vários métodos destes num trait para o
Código: [Seleccione]
Vec<char>. Procurei no Crate.io, mas estranhamente, não encontrei nada. E prontos, como eu estou a pensar em ensinar Rust à minha filhota mais a sério e também a alguns amigos, lembrei-me de que poderia fazer este código, são
Código: [Seleccione]
+-1200 linhas de código com muitos testes para assegurar-me de que o código que implementei hoje e ontem à noite até às 2 H da matina está correto. E também para servir de exemplo para quem for usar este código nos seus programas de Rust!

Pelo facto da indexação ser caracter a caracter e de eu ter implementado muitas das funções do tipo de dados de String do Rust e até uma do TCL, obrigado NJay pela dica dos string Maps, como tinha os outros métodos já implementados, acabou por ser relativamente simples de implementar a string map e os joins de strings!


Nota: O projeto hoje passou de 159 linhas para 1200 linhas, por isso é como se fosse um projeto novo e agora ficou mesmo muito mais útil para uma iniciante usar o tipo Vec<char>.

Nota_2: Em Rust pode-se estender um tipo de dados que seja nosso com um trait externo, pode-se estender um tipo externo com um trait nosso (que foi o que eu fiz, ao criar vários traits meus para o tipo de dados genérico
Código: [Seleccione]
Vec<T> em que T foi parametrizado com o tipo de dados "char" ).
Mas não se pode estender um tipo que não seja nosso com um trait que não seja nosso. Isso tem um nome pomposo mas eu neste momento não me recordo do nome. 


Obrigado, fiquem bem e divirtam-se que a vida são dois dias e um já passou!

Cumprimentos,
João