2010-03-19 22 views
13

Tôi tự hỏi cách sử dụng các hàm từ một tập lệnh khác trong Lua. Ví dụ: giả sử GameObjectUtilities giữ các chức năng mà nhiều tập lệnh GameObject sẽ sử dụng. Kịch bản Slime (a GameObject) muốn sử dụng hàm trong GameObjectUtilities.Lua - Cách sử dụng các chức năng từ tập lệnh khác

Tôi đang gặp sự cố khi thao tác này hoạt động. Tôi đã xem here, nhưng tôi vẫn chưa thực sự hiểu đầy đủ. Tôi có cần tạo mô-đun hoặc bảng để giữ các chức năng trong GameObjectUtilities để các chức năng trong đó được sử dụng trong các tập lệnh khác không? Nếu vậy, cách tốt nhất để giải quyết vấn đề này là gì?

Rất kỳ quặc. Nó thực sự hoạt động khi tôi làm điều đó theo cách thông thường. Vấn đề là khi tôi chạy ứng dụng của tôi và nó cố gắng sử dụng kịch bản nó không hoạt động. Tôi không hiểu.

+1

Bạn đã xem gói.path - http://www.lua.org/manual/5.1/manual.html#pdf-package.path? Ngoài ra, bạn có chắc chắn bạn không nhận được bất kỳ lỗi nào từ Lua, có thể bạn bằng cách nào đó bỏ qua chúng? – sbk

Trả lời

12

Không, bạn không phải tạo mô-đun. Nếu bạn chỉ cần tạo foo.lua như thế này:

function double(n) 
    return n * 2 
end 

Và sau đó trong kịch bản của bạn, require 'foo', bạn sẽ có thể truy cập vào double chức năng giống như nó đã được xác định trong kịch bản tương tự. Những hàm này không thể nhận được tại địa phương của bạn, nhưng chúng được tạo trong cùng một môi trường - tất cả module 'name' sẽ tạo một bảng mới và đặt lại môi trường hiện tại cho bảng đó.

Vì vậy, bạn chỉ có thể làm:

function slimefunc(...) stuff() end 

Trong GameObjectUtils.lua, và nếu bạn require 'GameObjectUtils', sau đó Slime có thể chỉ cần sử dụng slimefunc. Hoặc, nếu bạn muốn nó được đặt tên không gian:

utils = {} 

function utils.slimefunc(...) stuff() end 

Và nó sẽ có thể truy cập là utils.slimefunc. (Nếu bạn làm điều đó, bạn sẽ phải thật sự cẩn thận khi không để tên của bạn bị rò rỉ - hãy sử dụng một cách khôn ngoan người dân địa phương.)

+0

Điều này không hoạt động.Nó không thể tìm thấy tập tin vì lý do nào đó. – Person

+0

Vâng, thực sự tôi nhận ra rằng tôi đã sử dụng cú pháp yêu cầu khác nhau, như yêu cầu (""); Tôi chuyển sang máy của bạn và tìm thấy đường dẫn tệp chính xác nhưng vẫn không thể tìm thấy tệp. Thật không may điều này đòi hỏi làm cho nó nhìn vào những nơi sai cho các tập tin khác. Tôi sẽ đăng một ví dụ. – Person

+0

"Cú pháp yêu cầu" của tôi chỉ là viết tắt của các cuộc gọi hàm. Nếu bạn đang gọi một hàm chỉ với một chuỗi ký tự hoặc một bảng (mặc dù không phải là một biến chứa), bạn có thể thay thế 'hàm ('')' hoặc 'hàm ({})' bằng 'hàm ''' và 'function {}', để lại các dấu ngoặc đơn. Nó không nên tạo sự khác biệt theo cách nào, vì yêu cầu chỉ là một chức năng bình thường. Bạn có chắc chắn cài đặt 'package.path' của bạn là chính xác không? – LeafStorm

1

Bạn chưa cung cấp đủ thông tin cho chúng tôi. Ví dụ: bạn không nói nếu GameObjectUtilities được xác định hoặc giá trị của nó là gì. (Tôi đoán nó được thiết lập để true.)

Tôi rất khuyên bạn nên mua second edition của tuyệt vời cuốn sách Lập trình Roberto Ierusalimschy trong Lua, điều này giải thích việc sử dụng thành ngữ của requiremodule rất đơn giản và rõ ràng. Nó cũng là một cuốn sách tuyệt vời cho bất cứ ai sử dụng Lua để giúp nhận được nhiều nhất của ngôn ngữ và thư viện. Như may mắn sẽ có nó, có một free sample chapter mà tại thời điểm này bao gồm chính xác các chủ đề mà bạn đang tìm kiếm. Nhưng vẫn mua sách; $ 25 chi tiêu tốt :-)

Nếu bạn không muốn mua sách, bạn có thể đọc số free sample chapter và bạn cũng có thể đọc khoảng how to do things the "old" way, without module(...), vì số entire previous edition là trực tuyến miễn phí.

Một câu trả lời ngắn có thể là tập lệnh "tiện ích" của bạn có thể là tạo bảngtrả lại.

Các vấn đề liên quan