Moduli:fun/isCallable

Nga Enciklopedi Puro Shqiptare
< Moduli:fun
Versioni i datës 10 gusht 2025 08:52 nga Kujdestari7 (diskuto | kontribute) (Krijoi faqen me "local debug_track_module = "Module:debug/track" local table_get_metamethod_module = "Module:table/getMetamethod" local require = require local type = type local function debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function get_metamethod(...) get_metamethod = require(table_get_metamethod_module) return get_metamethod(...) end --[==[ Return {true} if the input is a function or functor (an object which can be called li...")
(ndrysh) ← Version më i vjetër | shikoni versionin e tanishëm (ndrysh) | Version më i ri → (ndrysh)
Jump to navigation Jump to search

Udhëzuesi për këtë modul mund të krijohet te Moduli:fun/isCallable/doc.

local debug_track_module = "Module:debug/track"
local table_get_metamethod_module = "Module:table/getMetamethod"

local require = require
local type = type

local function debug_track(...)
	debug_track = require(debug_track_module)
	return debug_track(...)
end

local function get_metamethod(...)
	get_metamethod = require(table_get_metamethod_module)
	return get_metamethod(...)
end

--[==[
Return {true} if the input is a function or functor (an object which can be called like a function, because it has a {__call} metamethod).

Note: if the input is an object with a {__call} metamethod, but this function is not able to find it because the object's metatable is protected with {__metatable}, then it will return {false} by default, or {nil} if the {allow_maybe} flag is set.]==]
return function(obj, allow_maybe)
	if type(obj) == "function" then
		return true
	end
	-- An object is callable if it has a __call metamethod, so try to get it
	-- with get_metamethod().
	local success, __call = get_metamethod(obj, "__call")
	-- If this succeeds, `obj` will only be callable if the __call metamethod is
	-- a function (i.e. it can't itself be a callable table), so don't recurse
	-- to check it.
	if __call and type(__call) == "function" then
		return true
	-- If not, then the metatable is protected, so it's not possible to know if
	-- `obj` is callable without actually calling it.
	elseif not success then
		debug_track("fun/isCallable/protected metatable")
		if allow_maybe then
			return nil
		end
	end
	return false
end