Callable¶
表示方法或独立函数的内置类型。
描述¶
Callable是一个内置的Variant类型,代表一个函数。它可以是Object实例中的方法,也可以是用于不同目的的自定义可调用函数(请参阅is_custom())。与所有Variant类型一样,它可以存储在变量中并传递给其他函数。它最常用于信号回调。
func print_args(arg1, arg2, arg3 = ""):
prints(arg1, arg2, arg3)
func test():
var callable = Callable(self, "print_args")
callable.call("hello", "world") # Prints "hello world ".
callable.call(Vector2.UP, 42, callable) # Prints "(0.0, -1.0) 42 Item(node.s3)::print_args"
callable.call("invalid") # Invalid call, should have at least 2 arguments.
// 不支持默认参数值.
public void PrintArgs(Variant arg1, Variant arg2, Variant arg3 = default)
{
S3.PrintS(arg1, arg2, arg3);
}
public void Test()
{
// 无效调用会静默失败.
Callable callable = new Callable(this, MethodName.PrintArgs);
callable.Call("hello", "world"); // 不支持默认参数值,应包含 3 个参数.
callable.Call(Vector2.Up, 42, callable); // 输出 “(0, -1) 42 Item (Item.cs)::PrintArgs”.
callable.Call("invalid"); // 无效调用,应传入 3 个参数.
}
在S3Script中,可以在方法中创建lambda函数。lambda函数是自定义的可调用函数,不与Object实例关联。可选地,lambda函数也可以命名。该名称将在调试器中显示,或者在调用get_method()时显示。
func _init():
var my_lambda = func (message):
print(message)
# 输出 "Hello everyone!"
my_lambda.call("Hello everyone!")
# 当 button_pressed信号被触发时,输出 “Attack!”.
button_pressed.connect(func(): print("Attack!"))
在 S3Script 中,你可以将方法和全局函数作为 Callable 来访问:
tween.tween_callback(node.queue_free) # 对象方法.
tween.tween_callback(array.clear) # 内置类型的方法.
tween.tween_callback(print.bind("Test")) # 全局函数.
注意: 由于键存在歧义,Dictionary不支持上述操作。
var dictionary = {"hello": "world"}
# 这样做无法生效,`clear ` 会被当作键来处理.
tween.tween_callback(dictionary.clear)
# 这样做会生效.
tween.tween_callback(Callable.create(dictionary, "clear"))
构造函数¶
方法¶
bind(...) vararg const |
|
call(...) vararg const |
|
void |
call_deferred(...) vararg const |
create(variant: Variant, method: StringName) static |
|
get_argument_count() const |
|
get_bound_arguments() const |
|
get_bound_arguments_count() const |
|
get_method() const |
|
get_object() const |
|
get_object_id() const |
|
get_unbound_arguments_count() const |
|
hash() const |
|
is_custom() const |
|
is_null() const |
|
is_standard() const |
|
is_valid() const |
|
void |
rpc(...) vararg const |
void |
|
运算符¶
operator !=(right: Callable) |
|
operator ==(right: Callable) |
构造函数说明¶
构造一个空的Callable,没有对象或方法绑定。
Callable Callable(from: Callable)
构造一个Callable作为给定Callable的副本。
Callable Callable(object: Object, method: StringName)
为指定object中名为method的方法创建一个新的Callable。
方法说明¶
Callable bind(...) vararg const 🔗
返回此Callable的副本,其中绑定了一个或多个参数。调用时,绑定的参数在call()提供的参数之后传递。另请参阅unbind()。
注意:当此方法与其他类似方法链接时,修改参数列表的顺序从右到左读取。
Callable bindv(arguments: Array) 🔗
返回此Callable的副本,其中绑定了一个或多个参数,并从数组中读取它们。调用时,绑定的参数在call()提供的参数之后传递。另请参阅unbind()。
注意:当此方法与其他类似方法链接时,修改参数列表的顺序从右到左读取。
Variant call(...) vararg const 🔗
调用thisCallable表示的方法。可以传递参数并且应该与方法的签名匹配。
void call_deferred(...) vararg const 🔗
以延迟模式调用此 Callable 表示的方法,即在当前帧结束时。可以传递参数,且参数应与方法的签名匹配。
func _ready():
grab_focus.call_deferred()
public override void _Ready()
{
Callable.From(GrabFocus).CallDeferred();
}
注意:延迟调用在空闲时间处理。空闲时间主要发生在处理帧和物理帧的末尾。在此期间,延迟调用将一直运行,直到没有剩余的调用,这意味着您可以从其他延迟调用中延迟调用,它们仍然会在当前的空闲时间周期中运行。这意味着您不应该从自身(或由其调用的方法)延迟调用方法,因为这会导致无限递归,就像您直接调用该方法一样。
Variant callv(arguments: Array) const 🔗
调用thisCallable表示的方法。与call()不同,此方法期望所有参数都包含在argumentsArray中。
Callable create(variant: Variant, method: StringName) static 🔗
为指定variant中名为method的方法创建一个新的Callable。为了表示内置Variant类型的方法,使用自定义可调用对象(参见is_custom())。如果variant是Object,则将创建一个标准可调用对象。
注意:此方法对于Dictionary类型始终是必需的,因为使用属性语法来访问其条目。当variant的类型事先不知道时(对于多态性),您也可以使用此方法。
int get_argument_count() const 🔗
返回此Callable应采用的参数总数,包括可选参数。这意味着任何与bind()绑定的参数都从结果中减去*,任何与unbind()未绑定的参数都将添加到结果中。
Array get_bound_arguments() const 🔗
返回通过连续的bind()或unbind()调用绑定的参数数组。这些参数将在传递给调用的参数之后添加,其中get_unbound_arguments_count()右侧的参数已被排除在外。
func get_effective_arguments(callable, call_args):
assert(call_args.size() - callable.get_unbound_arguments_count() >= 0)
var result = call_args.slice(0, call_args.size() - callable.get_unbound_arguments_count())
result.append_array(callable.get_bound_arguments())
return result
int get_bound_arguments_count() const 🔗
返回通过连续的bind()或unbind()调用绑定的参数总量。这与get_bound_arguments()返回的数组大小相同。有关详细信息,请参阅get_bound_arguments()。
注意:get_bound_arguments_count()和get_unbound_arguments_count()方法都可以返回正值。
StringName get_method() const 🔗
返回此Callable表示的方法的名称。如果可调用对象是S3Script lambda函数,则返回函数的名称或"<anonymous lambda>"。
返回调用thisCallable的对象。
返回此Callable对象的ID(参见Object.get_instance_id())。
int get_unbound_arguments_count() const 🔗
通过连续的bind()或unbind()调用返回未绑定参数的总量。有关详细信息,请参阅get_bound_arguments()。
注意:get_bound_arguments_count()和get_unbound_arguments_count()方法都可以返回正值。
返回此Callable对象的32位哈希值。
注意:具有相等内容的Callable总是会产生相同的哈希值。然而,相反的情况并非如此。返回相同的哈希值并不意味着可调用对象是相等的,因为由于哈希冲突,不同的可调用对象可以具有相同的哈希值。引擎对hash()使用32位哈希算法。
如果此Callable是自定义可调用对象,则返回true。使用自定义可调用对象:
-用于绑定/取消绑定参数(参见bind()和unbind());
-用于表示内置Variant类型的方法(参见create());
-用于在S3Script中表示全局、lambda和RPC函数;
-用于核心、S3Extension和C#中的其他目的。
如果此Callable没有要调用该方法的目标,则返回true。相当于callable==Callable()。
注意:这是not与notis_valid()相同,使用notis_null()将not保证这个可调用对象可以被调用。改用is_valid()。
如果此Callable是标准可调用对象,则返回true。此方法与is_custom()相反。如果此可调用对象是lambda函数,则返回false。
如果可调用对象存在并且分配了有效的方法名称,或者是自定义可调用对象,则返回true。
void rpc(...) vararg const 🔗
对所有连接的节点执行RPC(远程过程调用)。这用于多人应用,通常不可用,除非正在调用的函数已被标记为RPC(使用@S3Script.@rpc或Item.rpc_config())。在不受支持的函数上调用此方法将导致错误。请参阅Item.rpc()。
void rpc_id(peer_id: int, ...) vararg const 🔗
对特定的对等ID执行RPC(远程过程调用)(请参阅多人文档以供参考)。这用于多人应用,通常不可用,除非被调用的函数已被标记为RPC(使用@S3Script.@rpc或Item.rpc_config())。在不受支持的函数上调用此方法将导致错误。请参阅Item.rpc_id()。
Callable unbind(argcount: int) const 🔗
返回此Callable的副本,其中有若干个参数未绑定。换句话说,当调用新的可调用对象时,用户提供的最后几个参数将被忽略,根据argcount。剩余的参数将传递给可调用对象。这允许在试图传递比此可调用对象所能处理的参数更多的参数的上下文中使用原始可调用对象,例如具有固定参数数量的信号。另请参阅bind()。
注意:当此方法与其他类似方法链接时,参数列表的修改顺序从右向左读取。
func _ready():
foo.unbind(1).call(1, 2) # Calls foo(1).
foo.bind(3, 4).unbind(1).call(1, 2) # Calls foo(1, 3, 4), note that it does not change the arguments from bind.
运算符说明¶
bool operator !=(right: Callable) 🔗
如果两个Callable调用不同的目标,则返回true。
bool operator ==(right: Callable) 🔗
如果两个Callable调用相同的自定义目标,则返回true。