Rustler 101: 페리스 세이

7537 단어 elixirrust
สร้าง Elixir Project ด้วย 믹스

$ 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
    

    좋은 웹페이지 즐겨찾기