Мне нужно добавить ./
к путям в моем коде, что я сейчас делаю следующим образом:
let path = Path::new("foo.sol");
let path_with_dot = Path::new("./").join(path);
Однако я хочу сохранить совместимость на нескольких платформах, добавляя ./
перед путем. Как я могу это сделать?
Ни один из двух. Я спрашиваю, есть ли в коде Rust какая-то константа, обозначающая «./». Или метод, который добавляет "./" без специального указания "./" в качестве аргумента.
Но «./» просто указывает путь к текущему рабочему каталогу, поэтому вы просто хотите получить путь к текущему рабочему каталогу?
В логике моего приложения есть разница между "foo.sol" и "./foo.sol". У меня уже есть первое, и я просто хочу сгенерировать второе, добавив «./». Как уже объяснялось, я уже знаю, как это сделать, но мне было любопытно, достаточно ли это распространенный сценарий для Rust, чтобы обеспечить для него какую-то идиоматическую функциональность.
В чем смысловая разница между «foo.sol» и «./foo.sol» в логике вашего приложения?
Я пишу инструмент командной строки, который манипулирует Solidity контрактами. Одна из самых популярных сред разработки для Solidity, Hardhat, рассматривает «foo.sol» как контракт, импортированный из «node_modules». Поэтому пользователь Hardhat должен добавить «./» перед путем импорта в контракте Solidity.
Итак, по умолчанию Hardhat ищет имена файлов без путей в каталоге node_modules. Если к имени файла добавить «./», то где Hardhat будет искать файл? В текущем рабочем каталоге инструмента CLI, который вы реализуете в Rust?
Нет, инструмент CLI создаст папку с несколькими контрактами. Позже, когда один из моих пользователей попытается скомпилировать контракты, Hardhat заглянет в эту папку, когда один из контрактов укажет «./» перед путем импорта. Я не понимаю, как это связано с моим первоначальным вопросом.
Это актуально, потому что, наконец, предоставив весь этот контекст, я теперь знаю, что std::env::current_dir вам не поможет, поскольку вы на самом деле работаете с этими путями не как с путями, а больше как со строками. Вы действительно просто спрашиваете: «Как я могу добавить строку «./» к другой строке?» верно?
На самом деле я работаю с путями, представленными как PathBuf
в моих структурах, потому что мне нужна функциональность пути в большинстве других моих кодов. Например, я часто использую функцию join. Вот почему я спросил, реализует ли тип Path
идиоматический способ добавления «./».
Итак, это std::path::MAIN_SEPARATOR то, что вы ищете? Вы хотите, чтобы разделитель пути был правильным на разных платформах?
Да!! Спасибо. Согласно Windows-эквиваленту ./ (текущий каталог), похоже, что точечная запись одинакова в Unix и Windows, поэтому все, что мне нужно сделать, это использовать MAIN_SEPARATOR
вместо /
. Спасибо за вашу поддержку!
Оглядываясь назад, «идиоматический» был не лучшим словом для описания моей проблемы. Я обновил заголовок и тело вопроса, чтобы они были более конкретными.
Зависящие от платформы 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);
И результат будет автоматически зависеть от платформы.
Вы спрашиваете, как добавить путь к пути к текущему рабочему каталогу, или вы спрашиваете, существует ли метод, противоположный
join
, то есть метод, который добавляет путь к другому пути вместо его добавления?