Забавный rust
От: vaa  
Дата: 31.05.22 02:16
Оценка:
Заставить заработать этот кусок потребовалось около получаса. Я все еще не понимаю разницы.
#[derive(Debug)]
struct Person {
    name : String
}

fn main() {
    let name = String::from("Alice");
    let alice = Person { name };            
    let bob = Person { name: "Bob".to_string() };
    for person in [alice, bob] {    
        println!("Hello, {:?}!", person);
   }    
   let name = "Mary";    
   println!("Hello, {}!", name);
}


Для сравнения код на F#:
type Person = { name : string }
let name = "Alice"
let alice = { name = name }
let bob = { name = "Bob" }
for e in [alice; bob ] do printfn "Hello, %A!" e
let name = "Mary"
printfn "hello, %s!" name


3 разных способа задать строковое значение. не многовато?
Впечатление от компилятора раста неплохие, в каждом месте подробное описание с подсказками, что можно сделать, не очень правда удачные.
например если в массиве поставить точку с запятой, то он предлагает боба пометить const,
помечаю , тогда он начинает верещать что bob надо заменить на bob : Person =. Зачем если тип справа определен?
Весело. Но если внимательно читать и постепенно исправлять то в конце концов собирается.
Смешанные чувства, то ли раст это одна большая бага, то ли фича
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 31.05.2022 2:17 Разраб . Предыдущая версия .
Re: Забавный rust
От: ArtDenis Россия  
Дата: 31.05.22 04:43
Оценка: :))
Здравствуйте, vaa, Вы писали:

vaa>Заставить заработать этот кусок потребовалось около получаса.


Раст — это про боль, страдание и преодоление осознания своей ущербности перед компилятором
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Забавный rust
От: Farsight СССР  
Дата: 31.05.22 06:38
Оценка: :))) :)
Здравствуйте, vaa, Вы писали:

vaa>fn main() {

vaa> let name = String::from("Alice");
vaa> let alice = Person { name };
vaa> let bob = Person { name: "Bob".to_string() };
vaa> for person in [alice, bob] {
vaa> println!("Hello, {:?}!", person);
vaa> }
vaa> let name = "Mary";
vaa> println!("Hello, {}!", name);
vaa>}
vaa>[/rust]

vaa>3 разных способа задать строковое значение. не многовато?

Первые 2 момента — String.
Третий — не String .

vaa>Смешанные чувства, то ли раст это одна большая бага, то ли фича

Да.
</farsight>
Re: Забавный rust
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.05.22 08:20
Оценка: 1 (1) +3
Здравствуйте, vaa, Вы писали:

vaa>3 разных способа задать строковое значение. не многовато?


Ну, понимаешь, строка, которую можно динамически изменять — это такая хитрая структурка данных, управляющая выделением памяти, буфер с символами, на который она ссылается, и всякое такое. А константная строка — это просто место в памяти, где лежат символы, и какой-то способ указать, где последовательность символов кончается ('\0', как в Си, или явный счетчик; не знаю уж, как в Русте).

Доступ к динамической строке чуть дороже. Руст считает своим долгом предоставить программисту возможность сэкономить пару-тройку тактов процессора там и сям, как и пару-тройку байтов. Поэтому да, константные строки и динамические строки — это разные зверушки.

Более высокоуровневый F# игнорирует мелкую экономию ради простоты. Поэтому да, в нем все проще.
Re[2]: Забавный rust
От: Ночной Смотрящий Россия  
Дата: 31.05.22 08:42
Оценка: 1 (1)
Здравствуйте, Pzz, Вы писали:

Pzz>Более высокоуровневый F# игнорирует мелкую экономию ради простоты. Поэтому да, в нем все проще.


Ничего он по факту не игнорирует, потому что, помимо string, есть еще StringBuilder и Span<char>/ReadOnlySpan<char>. Другое дело что если тот же ReadOnlySpan<char> массово пролазит в прикладной код — вот это уже беда.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Забавный rust
От: Michael7 Россия  
Дата: 31.05.22 08:54
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Доступ к динамической строке чуть дороже. Руст считает своим долгом предоставить программисту возможность сэкономить пару-тройку тактов процессора там и сям, как и пару-тройку байтов. Поэтому да, константные строки и динамические строки — это разные зверушки.


Чем Rust лучше языка Ada?

Для работы с текстом в Аде существует несколько предопределённых типов: Character, Wide_Character, Wide_Wide_Character, String, Bounded_String, Unbounded_String
и т.д. Тема весьма обширна, а так как со строками мы только знакомимся, то на данном этапе я ограничусь использованием самых «ходовых» типов и операций. В следующем разделе для решения задач нам понадобятся типы:

Character
— для работы с простыми символами (ASCII, не Unicode) (в принципе, работа с Wide_Characters
ничем не отличается);
String
— для работы с простыми строками (фактически это массивы заданной длины, состоящие из символов типа Character
);
Unbounded_String
— для работы со строками неопределённой длины. Т.е. размер переменной, в которую будет считываться строка, меняет свой размер по мере необходимости.



А вообще чем дальше тем больше начинает казаться, что в современном мейнстриме недооценена Ada. Язык дает немало средств для защищенного программирования, при этом с нативной компиляцией, ООП, языковые средства мультизадачности и т.д. Язык не академический, имеет кучу компиляторов, применяется как в микроконтроллерах, так и в некоторых бизнес-системах (хотя и редко).
Re[3]: Забавный rust
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.05.22 09:00
Оценка:
Здравствуйте, Michael7, Вы писали:

Pzz>>Доступ к динамической строке чуть дороже. Руст считает своим долгом предоставить программисту возможность сэкономить пару-тройку тактов процессора там и сям, как и пару-тройку байтов. Поэтому да, константные строки и динамические строки — это разные зверушки.


M>Чем Rust лучше языка Ada?


Ты б еще ASN.1 помянул

M>А вообще чем дальше тем больше начинает казаться, что в современном мейнстриме недооценена Ada. Язык дает немало средств для защищенного программирования, при этом с нативной компиляцией, ООП, языковые средства мультизадачности и т.д. Язык не академический, имеет кучу компиляторов, применяется как в микроконтроллерах, так и в некоторых бизнес-системах (хотя и редко).


Ада является местами отраслевым стандартом. В основном, вокруг военных, самолетных и космических направлений.
Re[3]: Забавный rust
От: Privalov  
Дата: 31.05.22 12:53
Оценка:
Здравствуйте, Michael7, Вы писали:

M>Чем Rust лучше языка Ada?


Фортран 4 все равно никто не превзойдет. Там строковых переменных не было вообще, зато строковых констант было 3 типа. Строковые переменные ввели в Фортране 77.

M>А вообще чем дальше тем больше начинает казаться, что в современном мейнстриме недооценена Ada.


Почему? В этой статье язык Ада вполне оценен.

К счастью, язык одобряемый Министерством Обороны, обладает достаточно интересными свойствами, которые делают его приемлемым — он невероятно сложен, включает в себя способы порчи операционной системы и перераспределения памяти, и Эдгар Дейкстра (Edsgar Dijkstra) не любит его.

Re[3]: Забавный rust
От: T4r4sB Россия  
Дата: 31.05.22 13:09
Оценка:
Здравствуйте, Michael7, Вы писали:

M>Чем Rust лучше языка Ada?


Ада — это отсутствие РВО и мув семантики? Это где глубокое копирование на каждый чих и перфоманс на уровне сишарпа?
Re: Забавный rust
От: Zhendos  
Дата: 31.05.22 14:23
Оценка: 1 (1)
Здравствуйте, vaa, Вы писали:

vaa>3 разных способа задать строковое значение. не многовато?


На самом деле больше:
    let s = "aaa".to_string();                                                                                                                                                    
    let s = String::from("aaa");                                                                                                                                                  
    let s: String = "aaa".into();                                                                                                                                                 
    let s: String = "aaa".chars().collect();                                                                                                                                      
    let s = String::from_utf8("aaa".as_bytes().to_vec()).unwrap();                                                                                                                
    let s = String::from_utf8(b"aaa".to_vec()).unwrap();                                                                                                                          
    let s = String::from_utf16(&"aaa".encode_utf16().collect::<Vec<u16>>()).unwrap();


и можно продолжать и продолжать.

Но в любом языке программирования так,
можно написать бесконечное множество функций переводящих данные типа T1
в тип T2.
Re[2]: Забавный rust
От: Zhendos  
Дата: 31.05.22 14:38
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, vaa, Вы писали:



Pzz>Доступ к динамической строке чуть дороже. Руст считает своим долгом предоставить программисту возможность сэкономить пару-тройку тактов процессора там и сям, как и пару-тройку байтов. Поэтому да, константные строки и динамические строки — это разные зверушки.


Ну для порядка стоит сказать что типы разные, но оперировать они могут
буквально одними и теми же данными:

let s_const: &str = "aaa";
let s_heap: String = s_const.into();
let s_const2: &str = &s_heap;


То есть s_const2 и s_heap указывают на один и тот же участок памяти.
Отличие (с точки зрения языка) s_const и s_const2 только в том что время жизни у них разное,
для s_const2 компилятор проверит что она живет не дольше s_heap, а вот
время жизни s_const равно времени жизни всей программы.


Pzz>Более высокоуровневый F# игнорирует мелкую экономию ради простоты. Поэтому да, в нем все проще.


Да, F# другой строкоывый тип, другие над ним операции,
но с абстрактной точки зрения разница не очень большая,
что в Rust что в F# можно объявить типы T1 и T2, так чтобы T1 реализовывал
только часть методов реализованных для T2 и написать какой-нибудь метод для T1
который вернет T2. Не понятно что такого особенного в этом увидел ТС.
Re[3]: Забавный rust
От: vaa  
Дата: 01.06.22 01:47
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Да, F# другой строкоывый тип, другие над ним операции,

Z>но с абстрактной точки зрения разница не очень большая,
Z>что в Rust что в F# можно объявить типы T1 и T2, так чтобы T1 реализовывал
Z>только часть методов реализованных для T2 и написать какой-нибудь метод для T1
Z>который вернет T2. Не понятно что такого особенного в этом увидел ТС.

Высокоуровневые ЯП обычно стремятся к максимальному уровню абстракции, пытаясь обобщить работу
с различными структурами данными. Рич Хикки замечательно продемонстрировал в кложе, что это возможно.

(defn f [x] x)
(map f [1 2 3]) // =>; (1 2 3)
(map f "hello") //=>; (\h \e \l \l \o)


Или раст не высокоуровневый ЯП?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: Забавный rust
От: ArtDenis Россия  
Дата: 01.06.22 03:55
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>Или раст не высокоуровневый ЯП?


Раст — это всего-лишь обрезанные и безопасные плюсы (отличия лишь в мощных растовских макросах). Откуда там сильно высокий уровень возьмётся?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Забавный rust
От: Basil2 Россия https://starostin.msk.ru
Дата: 01.06.22 08:44
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>3 разных способа задать строковое значение. не многовато?


Всего лишь нет автоматической конверсии из набора байт в (динамически выделяемую) строку.

На самом деле бесит только в мелких программках и в тестах, поскольку в реальном коде ты обычно не хардкодишь строковые данные руками.
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re[4]: Забавный rust
От: Zhendos  
Дата: 01.06.22 10:01
Оценка: +2
Здравствуйте, vaa, Вы писали:

vaa>
vaa>;(defn f [x] x)
vaa>;(map f [1 2 3]) // => (1 2 3)
vaa>;(map f "hello") //=> (\h \e \l \l \o)
vaa>;


vaa>Или раст не высокоуровневый ЯП?


Так вы же с этим и столкнулись и именно это вам не понравилось?
Все эти 10 способов перевести переменную типа "&str" в тип "String"
проистекают именно из желания писать абстракции.

"to_string" это из "trait ToString",
то есть чтобы писать такой "generic" код:
fn f<T: ToString>(x: T) -> Stirng {
   x.to_string()
}


Метод "from" из "trait From", метод "into" из "trait Into",
метод "collect" из "trait Iterator" и т.д.

И эти "trait" реализованы не только для "&str", но и еще
для кучи типов (и их конечно можно реализовать для своего типа).
То есть именно желание абстрагироваться привело
к стольким способам конвертации из типа "&str" в "String".
Отредактировано 01.06.2022 16:05 Zhendos . Предыдущая версия . Еще …
Отредактировано 01.06.2022 16:03 Zhendos . Предыдущая версия .
Re[3]: Забавный rust
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 01.06.22 22:54
Оценка: :)
M> Чем Rust лучше языка Ada?

Я уже задавал этот вопрос — https://www.linux.org.ru/forum/development/14561311
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.