Computer >> Máy Tính >  >> Lập trình >> Ruby

Hướng dẫn về Mô-đun Ruby FFI (Ví dụ:Phát MP3 với VLC)

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ố:

  1. Tên của hàm C
  2. Một mảng các loại đối số
  3. 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!