ABAP PERFORM参数传递详解:值传递、引用传递与性能优化
1. 项目概述理解PERFORM与参数传递的本质在ABAP开发领域PERFORM语句和参数传递机制是每个开发者从入门到精通都无法绕开的基石。这听起来可能像老生常谈但恰恰是这些最基础、最常用的功能在实际项目中埋下了最多的“坑”。我见过太多因为参数传递理解不透彻而导致的诡异Bug——数据在子程序里被莫名修改或者该传出去的值死活出不来调试半天才发现是USING和CHANGING用混了或者对值传递、引用传递的概念一知半解。简单来说PERFORM就是ABAP里调用子程序Form的命令。而参数传递则是调用方Caller和被调用方Form之间交换数据的桥梁。这个项目的核心就是彻底拆解这座“桥梁”的构造原理、通行规则以及那些容易让人栽跟头的暗坑。无论你是刚接触ABAP的新手还是已经写过无数报表的老手重新系统性地审视PERFORM的参数传递都能帮你写出更健壮、更易维护的代码。毕竟在复杂的业务逻辑和嵌套调用中清晰的数据流是调试和理解的命脉。2. 核心概念与语法深度解析2.1 PERFORM语句的基本结构PERFORM语句的语法看似简单但每个部分都值得深究。其完整形式如下PERFORM form_name [level] [USING p1 ... pn] [CHANGING c1 ... cn] [TABLES t1 ... tn].form_name: 要调用的子程序名称。这里有个细节ABAP允许通过level指定调用层级如PERFORM calc IN PROGRAM subprog但在现代开发中更推荐将可复用的Form封装在功能模块、类方法或本地类中以提高代码的内聚性和可移植性。USING和CHANGING: 这是参数传递的核心关键字。很多人初期会混淆它们其实从字面和使用意图上就能区分USING用于“使用”数据通常表示输入参数CHANGING用于“改变”数据通常表示输出或输入输出参数。但请注意这仅仅是“通常”和编程惯例ABAP编译器并不阻止你通过USING传入的参数在Form内部被修改取决于传递类型反之亦然。良好的编程习惯是严格遵守这个语义。TABLES: 专用于传递内表参数。在ABAP的早期版本和面向过程的编程中大量使用。但在新版本的ABAP特别是启用了ABAP OO和更严格检查的版本中TABLES参数已被视为过时Obsolete。官方推荐使用USING或CHANGING来传递内表因为这样能更清晰地表明内表参数的传递方式值传递或引用传递。对应的Form定义部分参数接口必须严格匹配FORM form_name [USING u1 [TYPE|LIKE] ... un [TYPE|LIKE] ...] [CHANGING c1 [TYPE|LIKE] ... cn [TYPE|LIKE] ...] [TABLES t1 [TYPE|LIKE] ... tn [TYPE|LIKE] ...]. Form 逻辑 ENDFORM.参数名在调用点和定义点可以不同但顺序、数量和类型必须一致。TYPE用于指定完整的数据类型如TYPE I,TYPE sflight-carridLIKE则用于参照一个已有变量的类型定义。2.2 参数传递的三种类型值、引用与值结果这是理解PERFORM参数传递最关键的部分直接决定了数据在调用栈中的行为。ABAP支持三种参数传递类型通过在Form参数定义时使用不同的附加项来指定值传递Pass by Value:FORM my_form USING VALUE(p_input) TYPE i CHANGING VALUE(p_output) TYPE i.原理调用时实参的值被复制一份传递给形参。在Form内部操作的是这份独立的副本。影响对p_input的修改不会影响调用方的原始变量。对p_output的修改也仅在Form内部有效。除非在ENDFORM.时形参p_output的当前值会再次被复制回对应的实参。这是CHANGING VALUE(...)的特殊之处称为“值结果传递”Pass by Value and Result。对于USING VALUE(...)则没有回传过程。适用场景当你想确保原始输入数据在子程序中不被意外修改时对输入参数使用USING VALUE(...)。对于输出参数通常不推荐使用CHANGING VALUE(...)因为存在一次额外的拷贝开销且语义上“改变值结果”不如引用传递直观。引用传递Pass by Reference:FORM my_form USING p_input TYPE i CHANGING p_output TYPE i. 或者显式声明 FORM my_form USING p_input TYPE i CHANGING p_output TYPE i.原理这是USING和CHANGING参数的默认传递类型如果没有显式指定VALUE。调用时传递的是实参的内存地址引用。形参和实参指向同一块内存。影响在Form内部对形参的任何修改都会直接、立即反映在调用方的实参上。适用场景这是最常用、最高效的方式尤其适用于传递大型内表或结构。当需要子程序修改参数值并让调用方感知时必须使用引用传递即默认的CHANGING。值传递只读For Read-Only:FORM my_form USING p_input TYPE string READ-ONLY.原理这是一种特殊的引用传递。传递的是引用但编译器会禁止在Form内部对形参进行任何修改赋值操作。影响既享受了引用传递无拷贝的性能优势又保证了数据的不可变性安全性更高。适用场景传递大型字符串、内表等只读数据时强烈推荐使用。它能明确设计意图防止误操作并且比USING VALUE(...)性能更好。关键心得很多开发者困惑于“为什么我USING进来的参数在Form里被改了”根源就在于默认的引用传递。如果你不希望输入参数被修改最安全的方式是使用USING VALUE(...)或USING ... READ-ONLY。对于CHANGING参数除非有特殊理由比如需要基于原始值进行复杂计算后再一次性回写否则都应使用默认的引用传递。2.3 USING与CHANGING的语义与最佳实践尽管技术上USING和CHANGING都可以配合不同的传递类型实现多种效果但遵循明确的语义约定能让代码可读性大幅提升。USING应仅用于输入参数。表明这些数据是子程序执行所需的“原料”子程序不应该或至少主要目的不是去改变它们。为了强化这一点建议如果参数是基本类型或小型结构且确保不被修改可以使用USING VALUE(...)。如果参数是大型对象内表、长字符串为了性能使用USING ... READ-ONLY。避免在USING参数非VALUE或READ-ONLY中进行修改即使语法允许。CHANGING应仅用于输出或输入输出参数。表明调用方期望子程序操作这些变量并返回结果。它几乎总是使用默认的引用传递以实现高效的数据回写。纯输出参数在调用前其值无关紧要甚至可以是初始值。子程序负责为其填充有效数据。输入输出参数调用方提供一个初始值子程序基于该值进行计算和修改。一个清晰的Form接口示例FORM calculate_discount USING VALUE(iv_customer_type) TYPE char10 is_order_header TYPE sorder READ-ONLY CHANGING ct_order_items TYPE tt_order_items cv_total_discount TYPE wrbtr. iv_customer_type: 值传递输入安全。 is_order_header: 只读引用传递输入高效且安全。 ct_order_items: 引用传递的输入输出参数子程序会修改项目折扣。 cv_total_discount: 引用传递的输出参数子程序计算总折扣。 ENDFORM.3. 高级主题与性能考量3.1 内表传递的陷阱与优化内表作为ABAP中最常用的数据结构之一其传递方式对性能影响巨大。TABLES参数已过时在新项目中绝对不要再使用TABLES。它隐含着引用传递且类型检查较弱容易出错。使用USING或CHANGING替代。性能对比USING itab TYPE tt_data READ-ONLY最佳实践。无拷贝只读安全性能最优。CHANGING itab TYPE tt_data如果需要修改内表就用这个。也是引用传递性能最优。USING VALUE(itab) TYPE tt_data或CHANGING VALUE(itab) TYPE tt_data性能灾难。这会导致整个内表在调用时被完整复制一份。对于大型内表开销不可接受。内表头部Header Line的历史问题在非常古老的ABAP代码中你会看到带表头With Header Line的内表以及TABLES参数。现代ABAP严禁使用带表头的内表。始终使用DATA lt_itab TYPE TABLE OF ...来声明内表并通过LOOP AT lt_itab ASSIGNING fs.或INTO wa来操作。3.2 字段符号Field Symbols与数据引用Data References作为参数有时你需要传递一个动态指定的字段或者一个数据对象的引用。字段符号Field Symbols字段符号本身是一个指向某个数据对象的“指针”。将字段符号作为参数传递时传递的是这个“指针”的引用。FORM process_field CHANGING fs_data TYPE any. ASSIGN ... TO fs_data. 可以重新分配 fs_data 100. 修改指向的数据 ENDFORM.在调用时需要传递一个已分配的字段符号PERFORM process_field CHANGING my_fs。这提供了极大的灵活性但也要小心指针悬空。数据引用Data References数据引用变量TYPE REF TO data存储的是对数据的引用。通常以引用传递方式传入Form。FORM process_ref USING ir_data TYPE REF TO data. FIELD-SYMBOLS lv_data TYPE any. ASSIGN ir_data-* TO lv_data. 解引用 IF lv_data IS ASSIGNED. lv_data ... 操作数据 ENDIF. ENDFORM.调用DATA lr_ref TYPE REF TO data. lr_ref REF #(my_var). PERFORM process_ref USING lr_ref.。这种方式常用于处理完全未知结构的数据。注意事项使用字段符号和数据引用会绕过编译器的部分类型检查增加了运行时错误如ASSIGN失败的风险。务必在使用前用IS ASSIGNED或IS BOUND进行检查并确保异常处理得当。3.3 参数类型检查与RTTI运行时类型信息ABAP是强类型语言参数传递时的类型兼容性规则需要清楚完全匹配TYPE声明的类型必须完全一致。结构兼容如果使用LIKE则参照变量需存在。传递的结构可以比形参结构拥有更多字段但类型需兼容反之则不行。泛型类型使用TYPE any,TYPE any table,TYPE data等可以接受多种类型但在Form内部需要使用RTTICL_ABAP_TYPEDESCR或字段符号来动态处理。在需要高度动态性的场景可以在Form内部利用RTTI来探测传入参数的实际类型和属性FORM dynamic_analysis USING i_data TYPE any. DATA(lo_type_descr) cl_abap_typedescrdescribe_by_data( i_data ). CASE lo_type_descr-type_kind. WHEN cl_abap_typedescrtypekind_int. 处理整数 WHEN cl_abap_typedescrtypekind_table. 处理内表 DATA(lo_table_descr) CAST cl_abap_tabledescr( lo_type_descr ). 可以进一步获取行类型等 ENDCASE. ENDFORM.4. 实战演练从简单到复杂的案例4.1 案例一基础数据交换让我们从一个最常见的场景开始交换两个变量的值。很多人第一反应是写一个SWAP的Form。* 错误示范试图用 USING VALUE 实现交换 FORM swap_bad USING VALUE(a) TYPE i VALUE(b) TYPE i. DATA temp TYPE i. temp a. a b. 修改的是副本a b temp. 修改的是副本b ENDFORM. 调用后外部变量无变化 * 正确示范使用 CHANGING 引用传递 FORM swap_good CHANGING a TYPE i b TYPE i. DATA temp TYPE i. temp a. a b. 直接修改外部变量a b temp. 直接修改外部变量b ENDFORM. START-OF-SELECTION. DATA(x) 10. DATA(y) 20. PERFORM swap_good CHANGING x y. WRITE: / x , x, y , y. 输出x 20, y 10这个例子清晰地展示了VALUE和默认引用传递在效果上的天壤之别。4.2 案例二处理内表数据假设我们需要一个Form来过滤一个订单内表只保留金额大于某值的行。TYPES: BEGIN OF ty_order, id TYPE char10, amount TYPE wrbtr, END OF ty_order. TYPES: tt_orders TYPE TABLE OF ty_order WITH EMPTY KEY. FORM filter_orders_by_amount USING it_orders TYPE tt_orders READ-ONLY iv_min_amount TYPE wrbtr CHANGING ct_filtered TYPE tt_orders. 清空输出表 CLEAR ct_filtered. 循环只读输入表 LOOP AT it_orders INTO DATA(ls_order) WHERE amount iv_min_amount. 将符合条件的行插入到输出表 INSERT ls_order INTO TABLE ct_filtered. ENDLOOP. ENDFORM. START-OF-SELECTION. DATA lt_all_orders TYPE tt_orders. DATA lt_big_orders TYPE tt_orders. ... 填充 lt_all_orders ... PERFORM filter_orders_by_amount USING lt_all_orders 1000 CHANGING lt_big_orders.这里输入内表使用READ-ONLY保证效率和安全性输出内表使用CHANGING引用传递来接收结果。注意我们在Form内部CLEAR了输出表这是一个好习惯避免调用方残留数据造成混淆。4.3 案例三动态结构处理考虑一个更复杂的场景我们需要一个通用的Form能够为任意结构的一个指定字段赋值。FORM set_field_value CHANGING cs_data TYPE any USING iv_field_name TYPE string iv_value TYPE any. FIELD-SYMBOLS: lv_field TYPE any. 尝试将指定字段分配给字段符号 ASSIGN COMPONENT iv_field_name OF STRUCTURE cs_data TO lv_field. IF sy-subrc 0. 赋值前可以进行类型转换或检查这里简化了 lv_field iv_value. ELSE. 处理字段不存在的情况 MESSAGE e398(00) WITH iv_field_name 字段不存在. ENDIF. ENDFORM. START-OF-SELECTION. DATA: BEGIN OF ls_employee, id TYPE i, name TYPE string, department TYPE string, END OF ls_employee. PERFORM set_field_value CHANGING ls_employee USING name 张三. PERFORM set_field_value CHANGING ls_employee USING department 销售部. WRITE: / ls_employee-name, ls_employee-department.这个Form展示了如何使用TYPE any和字段符号来处理动态字段访问。CHANGING cs_data TYPE any使用了引用传递确保对结构的修改能生效。ASSIGN COMPONENT是动态编程的核心语句之一。5. 常见错误、调试技巧与性能调优5.1 典型错误排查清单在调试PERFORM参数相关问题时可以按以下清单排查现象可能原因检查点与解决方法子程序内修改了参数但调用方变量未变。1. 对USING VALUE(...)参数进行了修改。2. 误以为USING默认引用参数在修改后会自动回传它确实会因为引用传递。但如果是USING VALUE(...)则不会。检查Form参数定义确认是VALUE(...)还是默认引用。根据意图修正。修改了CHANGING参数调用方有时能看到变化有时不能。可能对CHANGING参数使用了VALUE(...)即“值结果传递”。只有在Form正常结束执行到ENDFORM时值才会复制回去。如果在Form内RETURN、EXIT或发生异常修改可能丢失。避免对CHANGING使用VALUE除非你明确理解“值结果”语义并有特殊需求。传递内表后程序性能急剧下降。使用了USING VALUE(itab)或CHANGING VALUE(itab)导致内表被完整拷贝。改为USING itab ... READ-ONLY或CHANGING itab ...。字段符号作为参数在Form内ASSIGN失败。调用方传递的字段符号本身未分配NOT ASSIGNED。在Form内部使用IF fs IS ASSIGNED.判断。在调用前确保字段符号已正确分配。类型不匹配错误如ITAB不是表类型。Form参数定义为TYPE TABLE OF但调用时传递了一个非表类型的变量。或者TABLES参数与内表类型不兼容。检查变量声明和Form参数定义。使用TYPE而不是LIKE来获得更严格的编译检查。弃用TABLES。在Form中读取USING READ-ONLY内表时出错。试图修改READ-ONLY内表例如INSERT,DELETE,MODIFY语句或者LOOP ... ASSIGNING后对字段符号赋值。READ-ONLY禁止任何修改操作。使用LOOP ... INTO值复制到工作区来读取数据。如果需要修改就不能用READ-ONLY。5.2 调试与性能分析技巧使用ABAP调试器观察参数在调试器中进入Form后查看“变量”标签页。你可以清晰地看到每个参数是“传入引用”IMPORTING Ref还是“传入值”IMPORTING。将鼠标悬停在参数变量上可以看到其内存地址如果两个地方的变量地址相同则是引用传递。运行时分析SAT如果你怀疑某个PERFORM调用尤其是涉及内表值传递的是性能瓶颈使用事务码SAT运行时分析对其进行跟踪。重点关注“已用时间”和“被调用次数”。如果发现某个Form耗时异常检查其参数传递方式。代码检查SCI, ATC配置并运行代码检查器如扩展程序检查SCI或ABAP测试协作者ATC。它们可以标记出潜在问题例如使用过时的TABLES参数、可能低效的值传递大型对象等。明确传递意图在Form定义时为每个参数添加清晰的注释说明其用途输入/输出/输入输出和传递方式的选择理由。这能极大提升代码的可维护性。5.3 架构层面的思考何时该用PERFORM虽然PERFORM是ABAP的基石但在现代ABAP开发特别是S/4 HANA和ABAP云中其使用场景正在被更先进的封装方式所取代功能模块Function Module提供更标准的接口导入/导出/变更/表参数、异常处理和远程调用能力。类与方法Class and Method面向对象编程的核心。方法通过IMPORTING、EXPORTING、CHANGING、RETURNING参数进行数据交换支持继承、多态和更严格的封装。这是新开发的首选。本地类中的私有方法即使在报表程序中也优先将相关逻辑封装在本地类的私有方法中而不是使用全局的FORM。这能更好地管理作用域和生命周期。那么PERFORM还用在哪儿它仍然适用于简单的、一次性使用的报表程序内部的子程序划分。遗留代码的维护。某些需要极简上下文的工具脚本。对于新的、复杂的业务逻辑强烈建议直接使用ABAP类来组织代码。将PERFORM视为过程式编程时代的利器但在设计新模块时拥抱面向对象是更可持续的选择。理解PERFORM的参数传递其价值更多在于读懂和维护存量代码以及深刻理解ABAP数据传递的基本原理这些原理同样适用于类方法的参数传递虽然语法是IMPORTING/EXPORTING但底层传递类型的思想是相通的。

相关新闻

Win11硬盘卡顿与防火墙拦截:从根源排查到精准解决

Win11硬盘卡顿与防火墙拦截:从根源排查到精准解决

1. 从“硬盘卡顿”到“防火墙信任”:两个看似无关的Win11痛点 如果你刚升级到Windows 11,或者正在使用它,大概率遇到过这两个让人头疼的场景:一个是当你打开“此电脑”,准备拷贝文件或者查看硬盘内容时,那个…

2026/10/10 5:25:00 阅读更多 →
MySQL AUTO_INCREMENT:从原理到实战,全面解析自增主键的设计与优化

MySQL AUTO_INCREMENT:从原理到实战,全面解析自增主键的设计与优化

1. 从“手动分配”到“自动生成”:为什么我们需要AUTO_INCREMENT? 在数据库设计的早期,给每一条新记录找一个唯一标识符,常常是件让人头疼的事。想象一下,你负责一个用户注册系统,每当有新用户加入&#xf…

2026/10/10 1:24:42 阅读更多 →
AI科研助手引证忠实度评估:从RAG到Agentic的可靠引用守卫系统

AI科研助手引证忠实度评估:从RAG到Agentic的可靠引用守卫系统

1. 项目概述:当AI成为科研助手,我们如何信任它的“参考文献”? 最近在折腾一个挺有意思的项目,核心就围绕一个听起来有点学术,但实际痛点非常具体的问题:如何评估并守护AI在科研文献综述中的“引证忠实度”…

2026/10/10 15:14:23 阅读更多 →

最新新闻

Agent任务规划与推理模式重构:从过度规划到高效执行

Agent任务规划与推理模式重构:从过度规划到高效执行

一个任务丢给 Agent,很多时候都会得到一份漂亮但没法落地的计划。我在调 Pi agent 的时候就撞上过这类问题:让它做稍微复杂一点的事,它要么把简单任务拆出十来个步骤,要么在执行中反复重新评估,迟迟不调用工具&#xf…

2026/10/14 7:52:44 阅读更多 →
Spring Boot + Spring AI 实现生产级Java个人Agent实践

Spring Boot + Spring AI 实现生产级Java个人Agent实践

做AI Agent这一年多,我最常被问的一句话是:Java能做Agent吗?问这个问题的人,基本都是后端团队的技术负责人,系统跑在Spring Boot上,团队没人愿意为了一两个智能体功能单独养一套Python服务。我的回答一直是…

2026/10/14 7:52:44 阅读更多 →
后门漏洞排查与防御:从netstat到系统加固的实用指南

后门漏洞排查与防御:从netstat到系统加固的实用指南

在新手群里混久了,发现一个很有意思的现象:一说"后门漏洞",大多数人第一反应是那些好莱坞电影里的黑客镜头——敲几行代码,屏幕绿光一闪,电脑就沦陷了。但实际上,我带过的几个刚入行的朋友&#…

2026/10/14 7:52:44 阅读更多 →
MATLAB信号处理高频函数实战:FFT、滤波器与频谱分析详解

MATLAB信号处理高频函数实战:FFT、滤波器与频谱分析详解

做信号处理这行,MATLAB里那几十个函数,真正每天抓在手里用的其实就那么十来个。这篇是这个系列的第三篇,我打算把平时处理振动、音频、生物电这类实测信号时用得最频繁的函数挨个过一遍,不按教科书目录念定义,只讲这些…

2026/10/14 7:52:44 阅读更多 →
基于Java与Spring AI的生产级Personal Agent构建实践

基于Java与Spring AI的生产级Personal Agent构建实践

做这个项目之前,我的任务清单其实是这样的:让 Java 技术栈在生产环境里跑起一个真正“能干活的” Personal Agent,而不是又一个只能聊天的 API 壳子。折腾了一个多月,总算是把 Spring Boot Spring AI 这套组合从模型接入、工具注…

2026/10/14 7:52:44 阅读更多 →
Java Lambda不只是语法糖:从字节码到序列化的工程实践

Java Lambda不只是语法糖:从字节码到序列化的工程实践

1. Lambda身后的字节码:语法糖背后的真实身份1.1 先说结论:Lambda不完全是"匿名内部类的简写"很多Java开发者对Lambda最早的认知,就是"可以用Lambda代替匿名内部类,代码更简洁"。这个说法在80%的日常场景下是…

2026/10/14 7:51:44 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →