找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 23|回复: 0

[教程] 支持链式if-elif-else的If行为

[复制链接]
发表于 10 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我这个标题好像起的很烂……主要是不知道该怎么说,也不知道之前有没有人做过这个东西如果有人做过的话那就最好了,我们可以用别人的了


好了废话不多说,我们来看看实际内容吧
---
我们知道renpy有一个名叫If的action,它的作用是根据入参表达式的值选择不同的action,但是这个东西有一个缺点,那就是相当于只支持if/else语句块,如果我们想写if/elif……/else的话需要多层嵌套,虽然嵌套几层不是什么大问题,但是如果(我是说如果)要嵌套非常多层的话,那If就不太好用了
于是我们带来了一个新函数:IfElif(掌声)
[Python] 纯文本查看 复制代码
def IfElif(*args):
    default = None
    args = list(args)

    if len(args) % 2 == 1:
        last = args[-1]

        if isinstance(last, list):
            all_action = all(isinstance(item, Action) for item in last)
            if all_action:
                default = last
        elif isinstance(last, Action):
            default = last

        args = args[:-1]

    for i in range(0, len(args), 2):
        cond = args[i]
        value = args[i + 1]
        if cond:
            return value

    return default



这个函数的功能很简单,就是让renpy原本的函数可以增加很多表达式,根据表达式返回不同的action

函数解析如下:
函数的入参是*args,入参规则是condition1, action1, condition2, action2……简单来说就是第1、3、5位入参是表达式、第2、4、6位入参是表达式对应的action
当总入参数是奇数的时候,如果最后一个入参是action或者由action组成的列表,那么它会被当作“所有表达式都为False”时的默认值,如果他不是action,那么会被忽略

了解完功能之后就要来说缺点了:缺点就是没法延迟加载,所有的表达式都会被运行然后计算最终的值,这可能会产生一些副作用(比如某个函数的运行和整体的运行时间变长等)
我本来想做一些延迟加载的优化,比如说用lambda表达式或者eval,但是那样的话就会太麻烦了反而不好调用,而且也可能会产生一些其他问题
所以,暂时就这样吧,下课


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号 )

GMT+8, 2026-6-21 12:12 , Processed in 0.024497 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表