LINUX.ORG.RU

Качество книжек по Rust

 


1

4

Решил посмотреть что есть на русском языке по Rust для старта, и каково качество оригинала и перевода. Нашел книжку https://doc.rust-lang.ru/book/, решил посмотреть, хватит ли моих утомленных мозгов чтобы осилить введение в язык. Споткнулся в самом начале на элементарном примере:

io::stdin().read_line(&mut guess)
Вот что там написано:

Главная задача read_line — принять все, что пользователь вводит в стандартный ввод, и сложить это в строку (не переписывая её содержимое), поэтому мы передаём эту строку в качестве аргумента. Строковый аргумент должен быть изменяемым, чтобы метод мог изменить содержимое строки.

У меня когнитивный диссонанс. В одном предложении автор пишет что ввод надо сложить в строку, не переписывая ее содержимое. Окей. В следующем предложении написано, что аргумент должен быть изменяемым, чтобы метод мог изменить содержимое строки. Так будет переписываться строка или не будет?

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

Далее:

одним из главных преимуществ Rust является безопасность и простота использования ссылок. Чтобы дописать эту программу, вам не понадобится знать много таких подробностей. Пока вам достаточно знать, что ссылки, как и переменные, по умолчанию неизменяемы. Соответственно, чтобы сделать её изменяемой, нужно написать &mut guess, а не &guess. (В главе 4 ссылки будут описаны более подробно)

Что значит, что по умолчанию ссылки неизменяемы? Ведь мне только это достаточно знать. Неизменяем «адрес», хранимый в ссылке, или неизменяемы данные, на которые указывает ссылка? Что делает синтаксис «&mut guess» ? Он дает меняться «адресу», чтобы ссылка могла указываеть на другую область памяти, или дает меняться данным, на которые указывает ссылка? Почему, блин, с самого начала людей оставляют в неизвестности, не объясняя что конкретно происходит? Концепция владения в гл. 4 тут вообще не при чем.

Почему я пишу слово «адрес» в кавычках? Потому что я не смог понять, что такое ссылка. Поэтому я не понимаю механизм работы ссылки:

  • Ссылка Rust хранит адрес в памяти, где хранятся данные?
  • Ссылка Rust хранит адрес в памяти, где находится внутреннее описание переменной, на которую указывает ссылка? Через которое уже будет доступ к памяти, где хранятся данные?
  • Ссылка Rust вообще не хранит адрес в памяти, а хранит некий номер/дескриптор из какой-то таблицы доступных переменных, по которой получается адрес в памяти? Но тогда это адрес чего - самих данных или внутреннего описания переменной, по которой доступен адрес самих данных?
  • Может быть, конструкция вообще другая?
★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

не знаю как в расте, а в плюсах ссылка это псевдоним объекта, а не его адрес в памяти (адрес это указатель), соответственно константная ссылка делает константным объект

нужно написать &mut guess, а не &guess

хм, а почему не mut &guess? как-то противоречит принципу наименьшего удивления

Решил посмотреть что есть на русском языке по Rust для старта

а зачем? вакансий на расте чуть ли не на 2 порядка меньше, чем на плюсах

anonymous
()

Что значит, что по умолчанию ссылки неизменяемы?

подрузамевается те которые без mut

Что делает синтаксис «&mut guess»

создаёт мутабельную(она же уникальная) ссылку на guess, т.е. позволяет менять guess

про всё остальное: ссылка - это совершенно абстрактная косвенная ручка для объектов, не надо думать про какие-то там адреса, это просто неправильно, для возни с адресами есть отдельный тип указатель( и опять же это не только и не столько число) и общее у них только понятие косвенности

zurg
()
Последнее исправление: zurg (всего исправлений: 2)

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

Не то же самое. В оригинале написано «append that into a string (without overwriting its contents)». Ключевое слово «append», которое автор перевода упустил.

anatole
()
Последнее исправление: anatole (всего исправлений: 1)

У меня когнитивный диссонанс. В одном предложении автор пишет что ввод надо сложить в строку, не переписывая ее содержимое. Окей. В следующем предложении написано, что аргумент должен быть изменяемым, чтобы метод мог изменить содержимое строки. Так будет переписываться строка или не будет?

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

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

хм, а почему не mut &guess? как-то противоречит принципу наименьшего удивления

Это отдельная больная тема. Сложные правила синтаксиса, от которого зависит понимаемый контекст, зависимый от правил справа/слева в потоке токенов - это бичь C/C++/Rust.

Я вижу, что в Rust эту проблему взялись решить инверсно: вместо повсеместного использования утверждения неизменяемости (const), решили неизменяемость сделать по-умолчанию, а в коде, при необходимости, использовать утверждение изменяемости (mut). Да, частично символьный шум понизился, но принципиально ничего не изменилось, так же как и остался вопрос: как людЯм объяснять, в какой последовательности писать эти ваши & и *.

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

Там в целом странный перевод. «Guessing game» перевили как «игра в загадки». Правильнее что-то вроде «игра в угадывание числа».

Да, там любительский перевод, но что имеем то имеем. Переведено коряво, но от оригинала сильных отступлений не замечено.

Литературный перевод «Guessing game» будет элементарным: игра «Угадай число».

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

ссылка - это совершенно абстрактная косвенная ручка для объектов

Не, «абстрактная косвенная ручка» ничем не помогает пониманию что такое ссылка.

Фактически, ссылка - это указатель с дополнительной информацией времени компиляции о том каким фреймам стека принадлежат данные на которые этот указатель указывает (время жизни). Что позволяет детектировать use-after-free во время компиляции.

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

хм, а почему не mut &guess? как-то противоречит принципу наименьшего удивления

Предположу, что как и другие странные закидоны раста в синтаксисе это сделано не для разраба а для парсера, т.к. контекстно зависимые грамматики это сложно, а у разрабов лапки.

ya-betmen ★★★★★
()

Главная задача read_line — принять все, что пользователь вводит в стандартный ввод, и сложить это в строку (не переписывая её содержимое)

The full job of read_line is to take whatever the user types into standard input and append that into a string (without overwriting its contents)

Кривой перевод. «append» это не «сложить», а «добавить». То есть добавляем пользовательский ввод в строку, но не трогаем то, что уже лежало в строке (without overwriting).

Концепция владения в гл. 4 тут вообще не при чем.

Как раз при чём. Ссылка, в отличие от указателя, содержит информацию о том сколько должен жить владелец данных на которые она указывает (или, если более низкоуровнево, в каких фреймах стека должен лежать владелец данных).

Ссылка Rust хранит адрес в памяти, где хранятся данные?

Да. Если в корректной программе заменить ссылки на указатели, то поведение программы не изменится.

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

То есть добавляем пользовательский ввод в строку, но не трогаем то, что уже лежало в строке (without overwriting).

Я не понимаю. Как это? Дописываем справа что ли?

Ну, то есть, была в памяти строка с символами:

ThisIsString

Не знаю, есть там нулл-терминатед символ. Предположим что нет, иначе непонятно что делать с результатом (после нулл-символа, справа, появится еще что-то).

Мы не трогаем то что уже лежало в строке.

И добавляем пользовательский ввод в строку. Пользователь ввел «Shit». Значит результат будет:
ThisIsStringShit

Это имеется в виду или что-то другое?

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

Надеюсь на серию постов по изучению раста.

Сам стараюсь не лезть туда, а то увлекусь и кто тогда говнокодить на сишке будет? Никто кроме нас!

Но очень хочется понять за, что его все так любят и ненавидят.

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

Дописываем справа что ли?

Да, дописываем справа. String поддерживает изменение длины своего содержимого. Впрочем, изменение длины нужно практически для любых операций изменяющих строку, так как она содержит utf-8.

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

Не надо машинный перевод называть любительским.

что не так? в свое основное, рабочее время машина ездит. а в когда стоит на парковке - переводит книжки по русту. все правильно.

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

Онлищит!

Я проверил:

fn main() {
    let mut guess = String::from("ThisIsString");

    let _ = io::stdin().read_line(&mut guess);

    println!("You guessed: {}", guess);
}

И реально, guess не наполняется пользовательским вводом, как можно было бы подумать. А пользовательский ввод добавляется справа к тому что хранится в строковой переменной!
> cargo run
Shit
You guessed: ThisIsStringShit

Вот это мазафака. Неожиданно. Я думал что на авторов Rust только наговаривают, что они наркоманы, а они реально под веществами язык создавали.

Xintrea ★★★★★
() автор топика

ты опасный, лучше не продолжай, а то весь девелопмент будет заполнен твоей «критикой» раста; рекомендовать тебе прочитать доку полностью, а потом приходить с вопросами в интернеты, для начала в гугл,а потом на лорчик, конечно бесполезно

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

Rationale: переиспользование аллоцированой строкой памяти.

let mut line = String::new();
while let Ok(_) = io::stdin().read_line(&mut line) {
    // use line
    // ...
    // Очищаем строку, сохраняя выделенный под неё кусок памяти
    line.clear();
};

Но, да - неожиданно. Как и то, что символы переноса строки (\n, \r\n) тоже добавляются в строку.

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

И реально, guess не наполняется пользовательским вводом, как можно было бы подумать.

А можно узнать чего ты ожидал? Типа как в сишке передали указатель и он начинает его с индекса == 0 заполнять?

Тут же явно строка это «объект» и ничего противоестественного с ней делать нельзя. Только добавлять символы в начало или конец. Ну и по умолчанию (и вполне естественно) пихать их сзади. Для пустой строки поведение будет идентично сишке, для не пустой к индексу будет добавляться стрлен.

yax123 ★★★★★
()

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

Т.е. «сложить это в строку» и «append that into a string» это одно и то же? Вам бы английский хоть на базовом уровне выучить. Ну или попробуйте гугл переводчик что ли, если сами ну вот никак не можете изучить английский.

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

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

Сейчас мы наблюдаем, что люди, не знающие английского, взялись переводить документацию по сложному языку программирования. Почему бы вам не посоветовать именно им выучить английский? И почему бы вам не внести правки в оперсорчный проект? Вы же закапываете свой талант.

Xintrea ★★★★★
() автор топика

Что значит, что по умолчанию ссылки неизменяемы?

В процитированном вами же куске есть отсылка к 4й главе. Но зачем туда переходит просто кликнув на ссылке если можно побежать на ЛОР писать «как всё непонятно изложено!!».

Концепция владения в гл. 4 тут вообще не при чем.

Смотрим главу 4 «4.2. References and Borrowing» упс. Там кстати написано и даже на примере показано в чём отличие изменяемых ссылок от не изменяемых. Но опять же. Зачем куда-то переходить, что-то читать, пытаться понять. Если можно писать!

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

Почему бы вам не посоветовать именно им выучить английский?

Потому что я до сегодняшнего дня не знал, что есть такой ресурс с попыткой перевода.

И почему бы вам не внести правки в оперсорчный проект?

Во первых, я не переводчик. Во вторых, а мне это зачем? Моих скромных знаний английского достаточно чтобы читать технические тексты.

Вы же закапываете свой талант.

Слава богу, скромные знания английского это не самый большой мой талант. И заниматься переводом текста когда большинство даже русскоговорящих IT специалистов прекрасно читают технические тексты, на мой взгляд, и было бы закапыванием таланта, если вам нравится такая пафосная формулировка, хотя я бы сказал, что это просто пустая трата времени.

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

Смотрим главу 4 «4.2. References and Borrowing» упс. Там кстати написано и даже на примере показано в чём отличие изменяемых ссылок от не изменяемых. Но опять же. Зачем куда-то переходить, что-то читать, пытаться понять. Если можно писать!

Вы вопрос то читали? В главе 4.2 ничего не написано о том, как устроена ссылка. Там даже есть картинка, но и она весьма условная. Что значит ptr? Это адрес в памяти? Или адрес/номер в каком-то абстрактном пространстве, через который фактически можно «перепрыгнуть» с объекта s на объект s1? Если в абстрактном, то реализаций как это будет сделано «в реале» достаточно много.

Но вы то, конечно, в отличие от меня умеете читать между строк. А у меня, к сожалению, не такой понятийный аппарат, поэтому приходится спрашивать.

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

Только добавлять символы в начало или конец

Хочешь сказать, что в Rust строки «сегментные», и к неизменяемому содержимому строки можно добавить строку символов слева путем прописывания ссылки/указателя на добавляемый сегмент в таблицу указателей на сегменты?

Xintrea ★★★★★
() автор топика

Rust book это как талмуд Страуструпа для C++, не очень хорош для начинающих. На хабре даже статья есть как правильно его читать https://habr.com/ru/articles/537790/ :) Более-менее хорошая книга это Программирование на языке Rust сейчас чуть устарела, но вполне хороша для начинающих и с нормальным переводом кроме небольшой отсебятины в терминологии (например «характеристики» вместо трейтов).

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

Нынче качество перевода хромает на обе ноги. Одно время я занимался базой, которая формировалась из переводной литературы. Так вот, самый качественный переводной текст был из семидесятых годов.

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

Вы вопрос то читали?

Какой из? У вас во сути, если отбросить словоблудие, написано, что вы не поняли что такое ссылка. Смотрим что написано в книге:

A reference is like a pointer in that it’s an address we can follow to access the data stored at that address; that data is owned by some other variable. Unlike a pointer, a reference is guaranteed to point to a valid value of a particular type for the life of that reference.

Что тут непонятного?

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

Если кто-то решит что строку произвольной длины можно прочитать без выделений памяти, то об обработке ошибок выделения памяти, он вряд-ли задумается. Впрочем, в userspace коде такими ошибками сначала займётся OOM-killer и приложение его вмешательство обработать не сможет.

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 1)

С крабом на обложке - хорошая книга. У меня на столе лежит русский перевод «Программирование на языке Rust», издательство O’Reilly. На английском можно найти и второе издание с async/await.

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

Книга с крабом толковая. Там хорошо объясняются основные концепции с нужным количеством деталей. К слову, объясняется, как объекты лежат в куче, как представляются на стеке, без чего системного программирования не бывает.

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

в userspace коде такими ошибками сначала займётся OOM-killer и приложение его вмешательство обработать не сможет.

Это очень ограниченный взгляд на мир.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  printf("%p\n", malloc(101 * 1024 * 1024));
}
ulimit -v $((80 * 1024))
./a.out 
(nil)

Как видно, совсем нехитрыми манипуляциями malloc возвращает вполне себе реальный NULL.

vbr ★★★★★
()

Решил посмотреть что есть на русском языке по Rust для старта

плохая идея. Дело в том, что всё новомодное имеет нехилое запаздывание с переводами. Во-вторых, качество перевода, как вот в данном случае, не очень. Это при том, что даже в оригинале теперь попадается шлак - и смысл тогда читать шлак от шлака? Лучше потратить энное количество усилий, выучить иняз, и тогда откроется новое измерение в пространстве познания.

seiken ★★★★★
()

Все как всегда, без исключений: мартышка видит открытый проект, мартышка насирает туда «перевод». Неумение разговаривать ни на одном языке мира мартышку не останавливает, ибо до осознания этого факта мартышка не доросла и не дорастет.

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

Потому что не ссылка мутабельная, а объект по ссылке. В расте ссылка не то же самое, что в цпп, а по сути один из видов указателя.

Емнип ссылка и указатель в расте - ровнто то же, что и в других языках - это адрес. Строка - структура из указателя на массив символов (кажется юникодных), длинны строки и капасити массива. Мутабельность указателя на эту структуру и указателя на массив внутри структуры - два, сцуко, разных указателя. Как этого можно не понимать?

bdrbt
()