From c64e01ea4d7d8e694fd25df778d57298171ae229 Mon Sep 17 00:00:00 2001 From: akulij Date: Sun, 14 Dec 2025 09:57:29 +0800 Subject: [PATCH] vault backup: 2025-12-14 09:57:29 --- 4.2/1changes.md | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/4.2/1changes.md b/4.2/1changes.md index 4fb3e7f..1bbe38e 100644 --- a/4.2/1changes.md +++ b/4.2/1changes.md @@ -397,6 +397,7 @@ pub extern unsafe "C" fn count_case_ascii(c: Cased) -> u32 { counter } ``` + Соберите библиотеку. Выходным файлом получится target/debug/libmylib.so (В зависимости от вашей ОС расширение .so, используемое в linux, может замениться на .dylib в macos или .dll в windows). Можем проверить наличие символа в библиотеке для функции через nm из пакета binutils: ```bash # nm выведет весь список символов @@ -405,12 +406,44 @@ nm target/debug/libmylib.so | grep doublefast ``` Попробуем использовать нашу функцию, к примеру, такой код в Python: ```python -from ctypes import cdll +from ctypes import cdll, c_char_p, c_bool, c_uint32, Structure + +# Load the Rust shared library mylib = cdll.LoadLibrary("target/debug/libmylib.dylib") -print(mylib.doublefast(8)) + +# Mirror the Cased struct +class Cased(Structure): + _fields_ = [ + ("cstring", c_char_p), + ("case", c_bool), + ] + +# Declare function signature +mylib.count_case_ascii.argtypes = [Cased] +mylib.count_case_ascii.restype = c_uint32 + +# Example usage +s = b"Hello WORLD abc XYZ" + +# Count uppercase letters +upper = Cased( + cstring=s, + case=True, +) +upper_count = mylib.count_case_ascii(upper) + +# Count lowercase letters +lower = Cased( + cstring=s, + case=False, +) +lower_count = mylib.count_case_ascii(lower) + +print("Uppercase count:", upper_count) +print("Lowercase count:", lower_count) ``` -Успешно выведет 16 -*Информация о том, какие типы функция принимает и выдает не сохраняется в библиотеке, просто по дефолту python считает, что функция принимает и выдает i32* +Успешно выведет количество знаков + Такое применение имеет практическую пользу: аналогичный код на rust выполняется в разы быстрее, чем код на python, поэтому много библиотек для python пишутся на C, а со становления rust популяным многие уже пишутся на rust. ### Сборка статической библиотеки Что собрать то же самое, но в статическую библиотеку, нужно в `crate-type` изменить `cdylib` на `staticlib` (либо можно оставить и то и то, тогда будут собираться обе версии библиотеки):