Rustler 101: 페리스 세이
$ mix new ferris_ex --module FerrisEx
ใส่
rustler
เข้าไปใน 혼합 종속성defp deps do
[
{:rustler, "~> 0.21.1"}
]
end
หลังจากนั้นก็สั่ง
mix deps.get
เพื่อ 가져오기 종속성Rust Rust Project 생성 ผ่าน
rustler
ก็ จะ จะ มี 프롬프트 ให้ ใส่ ชื่อ 모듈 ลง ไป ผม ใส่ 모듈 ชื่อ FerrisEx.Native
และ ชื่อ Rust Library ก็ ตาม ตาม มัน ไป ไป$ mix rustler.new
==> toml
Compiling 10 files (.ex)
Generated toml app
==> rustler
Compiling 5 files (.ex)
Generated rustler app
==> ferris_ex
This is the name of the Elixir module the NIF module will be registered to.
Module name > FerrisEx.Native
This is the name used for the generated Rust crate. The default is most likely fine.
Library name (ferrisex_native) >
* creating native/ferrisex_native/.cargo/config
* creating native/ferrisex_native/README.md
* creating native/ferrisex_native/Cargo.toml
* creating native/ferrisex_native/src/lib.rs
Ready to go! See /Users/thanabodee/src/github.com/wingyplus/ferris_ex/native/ferrisex_native/README.md for further instructions.
Cargo.TOML ซึ่ง ซึ่ง อยู่ ใน
$PWD/native/ferrisex_native/Cargo.toml
แล้ว ทำ การ ใส่ ใส่ 라이브러리 ชื่อ ferris_says
ลง ไป ไป[dependencies]
rustler = "0.21.1"
lazy_static = "1.0"
...
ferris-says = "0.2"
และทำการแก้โค้ดของ lib.rs ตห้เป็น 기능 ตามท
use ferris_says;
use rustler::{Encoder, Env, Error, Term};
use std::io;
use std::str;
mod atoms {
rustler::rustler_atoms! {
atom ok;
}
} // 1
rustler::rustler_export_nifs! {
"Elixir.FerrisEx.Native",
[
("say", 1, say)
],
None
} // 2
fn say<'a>(env: Env<'a>, args: &[Term<'a>]) -> Result<Term<'a>, Error> {
let text: String = args[0].decode()?;
let mut cursor = io::Cursor::new(Vec::new());
ferris_says::say(&text.into_bytes(), 24, &mut cursor).unwrap();
Ok((atoms::ok(), str::from_utf8(&cursor.into_inner()).unwrap()).encode(env))
} // 3
จาก 스니펫 ข้างบน
FerrisEx.Native
เสร็จแล้วก็สั่ง
cargo build
มพื่อให้ 녹ต่อมาทำการสร้าง Elixir 모듈 เพื่อ 바인딩 กับ 러스트 라이브러리 ของเร
# ./lib/ferris_ex/native.ex
defmodule FerrisEx.Native do
use Rustler, otp_app: :ferris_ex, crate: :ferrisex_native
def say(_text), do: :erlang.nif_error(:nif_not_loaded)
end
เพื่อ เพื่อ เพื่อ จะ ที่ การ 바인딩 กับ 녹슬 도서관 ของ ของ เรา ได้ ได้ ต้อง ใช้ ใช้ ใช้
use Rustler
และ บอก ว่า จะ ผูก กับ กับ กับ กับ กับ ชื่อ ชื่อ ชื่อ อะไร ของ ของ เรา และ ต้อง มี มี เพื่อ ที่ ที่ ที่ ที่ ที่ ที่ ที่ ที่ ได้ ได้ ได้ ได้เสร็จแล้วก็ 복사 동적 라이브러리 ที่ได้จาก
cargo build
มาไว้ท$ cp ./native/ferrisex_native/target/debug/libferrisex_native.dylib ./priv/native/libferrisex_native.so
หลังจาก 복사
iex(1)> {:ok, out} = FerrisEx.Native.say("Hello, I'm Ferris.")
{:ok,
" ____________________\n< Hello, I'm Ferris. >\n --------------------\n \\\n \\\n _~^~^~_\n \\) / o o \\ (/\n '_ - _'\n / '-----' \\\n"}
iex(2)> IO.puts(out)
____________________
< Hello, I'm Ferris. >
--------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \
:ok
Reference
이 문제에 관하여(Rustler 101: 페리스 세이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/wingyplus/rustler-101-ferris-say-3jj6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)