Tôi khá chắc chắn rằng trong Lua, bạn có thể sử dụng một số có sẵn của metatable __index
, __newindex
và __call
để nhân rộng khoảng Ruby method_missing
của Ruby. Và tôi phần nào có:Có thể nhân rộng method_missing của Ruby trong Lua không?
function method_missing(selfs, func)
local meta = getmetatable(selfs)
local f
if meta then
f = meta.__index
else
meta = {}
f = rawget
end
meta.__index = function(self, name)
local v = f(self, name)
if v then
return v
end
local metahack = {
__call = function(self, ...)
return func(selfs, name, ...)
end
}
return setmetatable({}, metahack)
end
setmetatable(selfs, meta)
end
_G:method_missing(function(self, name, ...)
if name=="test_print" then
print("Oh my lord, it's method missing!", ...)
end
end)
test_print("I like me some method_missing abuse!")
print(this_should_be_nil)
Vấn đề của tôi là: Trong khi cú pháp tương tự, và tôi chắc chắn có thể sử dụng nó để nhân rộng chức năng, nó giới thiệu lỗi vi phạm. Mỗi biến duy nhất mà bạn sử dụng trong ngữ cảnh của bảng mà bạn áp dụng method_missing
sẽ không bao giờ là không, vì tôi phải trả về một đối tượng có thể được gọi để pass the buck
của cuộc gọi tiềm năng từ hàm chỉ mục đến cuộc gọi thực tế.
ie Sau khi xác định phương thức global_missing như trên, cố gắng gọi phương thức undefined 'test_print' chạy như mong đợi, nhưng giá trị của test_print khi được lập chỉ mục là không nil và các phương thức/biến khác không được trả lời, như this_should_be_nil
không phải là số không.
Vì vậy, có thể tránh được sự cố này không? Hoặc cú pháp có thể không được uốn cong để hỗ trợ sửa đổi này mà không sửa đổi nguồn ngôn ngữ chính nó? Tôi tưởng tượng những khó khăn phát sinh như thế nào trong Ruby, lập chỉ mục và gọi là tương tự, trong khi ở Lua họ là khác biệt.
Có trường hợp sử dụng hoặc loại trường hợp sử dụng nào mà bạn thường sử dụng kỹ thuật này để giải quyết không? Bạn có lẽ nên đề cập đến nó trong câu hỏi của bạn để tránh [vấn đề XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Có lẽ lua có thể cung cấp một cách tiếp cận khác cho nó. – greatwolf
Vì '__index' không được gọi nếu giá trị tồn tại trong một bảng, phần đầu tiên của hàm' __index' không sử dụng. – dualed