Tôi muốn trả lời một câu hỏi đơn giản…
FFI trong Ruby là gì ?
FFI là viết tắt của “Giao diện chức năng ngoại”.
Đó là một cách để sử dụng các hàm được xác định bằng các ngôn ngữ lập trình khác .
Mô-đun FFI của Ruby cung cấp cho bạn quyền truy cập vào các thư viện và mã bên ngoài mà bạn không có.
Chúng tôi thường sử dụng điều này để làm việc với mã C.
Ví dụ bao gồm :
- rb-inotify
- ruby-vips
- ruby-nfc
Bạn có thể viết các chương trình của riêng mình sử dụng FFI với sự trợ giúp của mô-đun FFI.
Làm thế nào?
Hãy xem một vài ví dụ về mã!
Khái niệm cơ bản về FFI:Chức năng Tải &Nhập
Bạn có thể làm việc với FFI bằng cách đưa các chức năng của nó vào một mô-đun mà bạn tạo.
Như thế này :
request 'ffi'module A mở rộng FFI ::Libraryend
Sau đó, bên trong mô-đun, chúng tôi sẽ tải một thư viện bằng ffi_lib
phương pháp.
Thư viện C, chẳng hạn như “DLL” trong Windows hoặc “SO” trong Linux, xuất danh sách các “ký hiệu” hoặc định nghĩa hàm mà một chương trình cung cấp cho người khác sử dụng.
Hãy yêu cầu “libc”, thư viện tiêu chuẩn của C.
Đây là cách thực hiện :
mô-đun A mở rộng FFI ::Thư viện ffi_lib 'c'end
Bây giờ :
Bạn có thể nhập các hàm cụ thể từ thư viện này dưới dạng các phương thức Ruby.
Với attach_function
phương pháp.
Đây là một ví dụ :
mô-đun A mở rộng FFI ::Thư viện ffi_lib 'c' Att_ Chức năng:strlen, [:string],:Ý địnhA.strlen ("abc") # 3
Điều này hoạt động như thế nào?
Đầu tiên, chúng ta biết rằng có một hàm trong C được gọi là strlen
, hàm này nhận chars *
như một đối số.
chars *
dịch sang String
trong Ruby.
Sau đó…
strlen
này hàm trả về một giá trị, là độ dài của chuỗi.
Nói cách khác, attach_function
có 3 tham số:
- Tên của hàm C
- Một mảng các loại đối số
- Một loại trả lại
Bạn sẽ phải đọc tài liệu để tìm hiểu loại chức năng cụ thể nào hoạt động với.
Thời gian cho một ví dụ khác!
Xây dựng trình phát phương tiện của riêng bạn
Bạn có thể tìm thấy nhiều thư viện thú vị để chơi cùng.
Trong Linux, hầu hết được tìm thấy dưới /usr/lib/
thư mục, bắt đầu bằng “lib” trong tên của họ và kết thúc bằng phần mở rộng “so”.
Liệt kê chúng như thế này :
ls /usr/lib/lib*.so
Đối với ví dụ này, chúng tôi sẽ sử dụng thư viện trình phát đa phương tiện của VLC :
/usr/lib/libvlc.so
Mục tiêu của chúng tôi là tải tệp mp3 và phát tệp đó!
Hãy bắt đầu với điều này :
yêu cầu 'ffi'module VLC mở rộng FFI ::Thư viện ffi_lib' vlc 'attachment_ Chức năng:libvlc_get_version, [],:stringend
Điều này cho phép bạn kiểm tra xem thư viện có đang tải chính xác không và sau đó in phiên bản của nó.
Như thế này :
VLC.libvlc_get_version # "3.0.6 Vetinari"
Bạn có thể đặt tên tùy chỉnh cho các phương thức này bằng cách thêm thông số thứ 4.
Ví dụ :
Attach_ Chức năng:get_version,:libvlc_get_version, [],:string
Sau đó, bạn có thể làm :
VLC.get_version
Chúng ta cần làm gì để phát mp3 bây giờ?
Nếu chúng ta xem tài liệu, thì libvlc_media_player_play
chức năng giống như con đường để đi.
Chức năng này cần một "đối tượng" trình phát đa phương tiện.
Một trình phát đa phương tiện cần một phương tiện và một phương tiện cần một phiên bản VLC.
Đây là quy trình :
VLC instance -> media -> media_player -> play
Tôi kết hợp điều này với nhau bằng cách đọc tài liệu cho libVLC
.
Con trỏ bộ nhớ trong Ruby ???
Trong C, bạn sẽ không tìm thấy bất kỳ đối tượng nào, mọi thứ được xử lý bằng con trỏ bộ nhớ.
Con trỏ bộ nhớ là một địa chỉ bộ nhớ có dữ liệu.
Hãy xem ví dụ về mã :
mô-đun VLC mở rộng FFI ::Thư viện ffi_lib 'vlc' đính kèm_ Chức năng:get_version,:libvlc_get_version, [],:chuỗi đính kèm_ Chức năng:mới,:libvlc_new, [:int,:int],:pointerendVLC.new (0, 0) # FFI ::Địa chỉ con trỏ =0x000055c6f04ae7b0
Do gọi VLC.new
chúng tôi nhận được một con trỏ.
Chúng ta phải chuyển nó cùng với các hàm C khác cần nó.
Bây giờ :
Ví dụ đầy đủ và cách sử dụng nó.
mô-đun VLC mở rộng FFI ::Thư viện ffi_lib 'vlc' đính kèm_ Chức năng:phiên bản,:libvlc_get_version, [],:chuỗi đính kèm_ Chức năng:mới,:libvlc_new, [:int,:int],:con trỏ đính kèm_ Chức năng:libvlc_media_new_path, [:con trỏ ,:string],:pointer Attach_ Chức năng:libvlc_media_player_new_from_media, [:pointer],:pointer Attach_ Chức năng:play,:libvlc_media_player_play, [:pointer],:int Attach_ Chức năng:dừng,:libvlc_media_player_stop, [:Con trỏ đính kèm],:tạm dừng :libvlc_media_player_pause, [:pointer],:dự định
Như vậy là đủ để chơi một số bản nhạc :
vlc =VLC.new (0, 0) media =VLC.libvlc_media_new_path (vlc, "/home/jesus/Downloads/meditation.mp3")player =VLC.libvlc_media_player_new_from_media (media) VLC.play (player)Thao tác này sẽ phát nhạc mà không cần mở bất kỳ loại giao diện trực quan nào.
Bạn có thể xây dựng giao diện web của riêng mình trên đó.
Hãy thử!
Tóm tắt
Bạn đã biết về sức mạnh tuyệt vời của
FFI
! Một mô-đun Ruby cho phép bạn sử dụng các thư viện bên ngoài như thể chúng là một phần của chính ngôn ngữ đó.Hãy chia sẻ bài viết này để nhiều người cùng thưởng thức nhé 🙂
Cảm ơn vì đã đọc!