Как добавить «./» к пути независимым от платформы способом?

Мне нужно добавить ./ к путям в моем коде, что я сейчас делаю следующим образом:

let path = Path::new("foo.sol");
let path_with_dot = Path::new("./").join(path);

Однако я хочу сохранить совместимость на нескольких платформах, добавляя ./ перед путем. Как я могу это сделать?

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

pretzelhammer 24.12.2020 19:00

Ни один из двух. Я спрашиваю, есть ли в коде Rust какая-то константа, обозначающая «./». Или метод, который добавляет "./" без специального указания "./" в качестве аргумента.

Paul Razvan Berg 24.12.2020 19:01

Но «./» просто указывает путь к текущему рабочему каталогу, поэтому вы просто хотите получить путь к текущему рабочему каталогу?

pretzelhammer 24.12.2020 19:03

В логике моего приложения есть разница между "foo.sol" и "./foo.sol". У меня уже есть первое, и я просто хочу сгенерировать второе, добавив «./». Как уже объяснялось, я уже знаю, как это сделать, но мне было любопытно, достаточно ли это распространенный сценарий для Rust, чтобы обеспечить для него какую-то идиоматическую функциональность.

Paul Razvan Berg 24.12.2020 19:09

В чем смысловая разница между «foo.sol» и «./foo.sol» в логике вашего приложения?

pretzelhammer 24.12.2020 19:11

Я пишу инструмент командной строки, который манипулирует Solidity контрактами. Одна из самых популярных сред разработки для Solidity, Hardhat, рассматривает «foo.sol» как контракт, импортированный из «node_modules». Поэтому пользователь Hardhat должен добавить «./» перед путем импорта в контракте Solidity.

Paul Razvan Berg 24.12.2020 19:18

Итак, по умолчанию Hardhat ищет имена файлов без путей в каталоге node_modules. Если к имени файла добавить «./», то где Hardhat будет искать файл? В текущем рабочем каталоге инструмента CLI, который вы реализуете в Rust?

pretzelhammer 24.12.2020 19:22

Нет, инструмент CLI создаст папку с несколькими контрактами. Позже, когда один из моих пользователей попытается скомпилировать контракты, Hardhat заглянет в эту папку, когда один из контрактов укажет «./» перед путем импорта. Я не понимаю, как это связано с моим первоначальным вопросом.

Paul Razvan Berg 24.12.2020 19:29

Это актуально, потому что, наконец, предоставив весь этот контекст, я теперь знаю, что std::env::current_dir вам не поможет, поскольку вы на самом деле работаете с этими путями не как с путями, а больше как со строками. Вы действительно просто спрашиваете: «Как я могу добавить строку «./» к другой строке?» верно?

pretzelhammer 24.12.2020 19:37

На самом деле я работаю с путями, представленными как PathBuf в моих структурах, потому что мне нужна функциональность пути в большинстве других моих кодов. Например, я часто использую функцию join. Вот почему я спросил, реализует ли тип Path идиоматический способ добавления «./».

Paul Razvan Berg 24.12.2020 19:43

Итак, это std::path::MAIN_SEPARATOR то, что вы ищете? Вы хотите, чтобы разделитель пути был правильным на разных платформах?

pretzelhammer 24.12.2020 19:46

Да!! Спасибо. Согласно Windows-эквиваленту ./ (текущий каталог), похоже, что точечная запись одинакова в Unix и Windows, поэтому все, что мне нужно сделать, это использовать MAIN_SEPARATOR вместо /. Спасибо за вашу поддержку!

Paul Razvan Berg 24.12.2020 19:49

Оглядываясь назад, «идиоматический» был не лучшим словом для описания моей проблемы. Я обновил заголовок и тело вопроса, чтобы они были более конкретными.

Paul Razvan Berg 24.12.2020 19:54
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
2
13
374
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Зависящие от платформы const для разделителей путей хранятся в std::path::MAIN_SEPARATOR. Вы можете использовать это для создания зависимых от платформы путей. Однако по умолчанию метод Path.join уже использует это const, поэтому вместо записи:

let path = Path::new("foo.sol");
let path_with_dot = Path::new("./").join(path);

Вы бы просто написали:

let path = Path::new("foo.sol");
let path_with_dot = Path::new(".").join(path);

И результат будет автоматически зависеть от платформы.

Другие вопросы по теме