Webkit IDL中自定义[命名]属性的获取(Getter)以及设置(Setter)函数

本文详细介绍了自定义属性与命名属性的获取和设置方法,包括如何使用CustomNamedGetter和CustomNamedSetter进行自定义绑定,以及如何实现自定义属性的获取和赋值。同时强调了在使用自定义绑定代码前的谨慎思考,并提供了多个示例代码供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、自定义命名属性的获取(Getter)以及设置(Setter)函数:

[CustomNamedGetter](i), [CustomNamedSetter](i)

总结: [CustomNamedGetter] 或者 [CustomNamedSetter] 允许你为命名属性的getter或者setter编写自己的绑定函数.

用法如下:

    [
        CustomNamedGetter,
        CustomNamedSetter
    ] interface MichaelNamedGetter {
    };

当Michael.foooooo被执行时,命名的getters定义了它的行为, 这里的foooooooo不是Michael的属性. 当语句"XXX.foooooooo = ..." 执行时,命名的setter定义了它的行为。[CustomNamedGetter] 和 [CustomNamedSetter] 允许你按照如下方式编写自己的绑定:

  • [CustomNamedGetter] in JavaScriptCore: You can write custom JSXXX::canGetItemsForName(...) and JSXXX::nameGetter(...) in WebCore/bindings/js/JSXXXCustom.cpp:
    bool JSXXX::canGetItemsForName(ExecState* exec, XXX* impl, const Identifier& propertyName)
    {
        ...;
    }

    JSValue JSXXX::nameGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName)
    {
        ...;
    }
  • [CustomNamedSetter] in JavaScriptCore: You can write custom JSXXX::putDelegate(...) in WebCore/bindings/js/JSXXXCustom.cpp:
    bool JSXXX::putDelegate(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
    {
        ...;
    }
二、自定义属性的获取和赋值函数

[Custom](m,a), [CustomGetter](a), [CustomSetter](a)

总结: 他们允许你这样编写绑定代码。

用法: [Custom] 可用于函数和属性. [CustomGetter][CustomSetter]只能用于属性:

    [Custom] void func();
    [CustomGetter, JSCustomSetter] attribute DOMString str;

我们应该尽可能少的使用自定义的绑定代码,因为他们可能有问题。在考虑使用他们之前,你应该慎重思考:我真的需要自定义绑定代码吗?推荐你修改代码生成器而不是自定义绑定代码。

在解释细节之前,让我澄清这些IDL属性之间的关系。

  • [Custom] 修饰于方法,便是你可以编写方法的绑定代码。
  • [CustomGetter] or [CustomSetter] 修饰属性,表示你可以为属性的getter、setter编写自己的代码。

举例:

  • Method: 
    interface XXX {
        [Custom] void func(int a, int b);
    };

你可以编写绑定代码:WebCore/bindings/js/JSXXXCustom.cpp:

    JSValue JSXXX::func(ExecState* exec)
    {
        ...;
    }

参考更多例子:WebCore/bindings/js/JSXXXCustom.cpp

  • Attribute getter: 
    interface XXX {
        [CustomGetter] attribute DOMString str;
    };

编写绑定代码: WebCore/bindings/js/JSXXXCustom.cpp:

    JSValue JSXXX::str(ExecState* exec) const
    {
        ...;
    }

参考更多例子:WebCore/bindings/js/JSXXXCustom.cpp

  • Attribute setter:
    interface XXX {
        [CustomSetter] attribute DOMString str;
    };

编写绑定代码: WebCore/bindings/js/JSXXXCustom.cpp:

    void JSXXX::setStr(ExecState*, JSValue value)
    {
        ...;
    }

注意: ObjC, GObject,CPP 绑定bindings 不支持自己定义的绑定代码.


<think>我们正在讨论IDL(InteractiveDataLanguage)中编译自定义函数的方法和步骤。根据引用[2],IDL中的函数必须以"Function"开头,以"End"结尾,并且最多有一个输出参数。同时,需要有一个关联的.pro文件进行编译。步骤概述:1.创建函数文件:编写一个以.pro为扩展名的文件,其中包含函数定义。2.函数结构:函数必须以`Function`关键字开始,然后是函数名和参数列表,最后以`End`结束。3.编译函数:在IDL环境中,使用`.compile`命令或者`@`命令来编译函数文件。4.调用函数:编译成功后,就可以像内置函数一样调用它。详细步骤:1.编写函数文件例如,我们创建一个名为`my_function.pro`的文件,内容如下:```idlFunctionMyFunction,a,b;计算两个数的和sum=a+bReturn,sumEnd```注意:函数名(此例中为`MyFunction`)必须与文件名(不含扩展名)一致。2.编译函数IDL命令行中,可以使用以下命令之一:-使用`.compile`命令:```idl.compile'my_function.pro'```-使用`@`命令(这是`.run`的简写,但用于函数时通常用.compile):```idl@my_function.pro```注意:使用`@`命令实际上会执行文件中的代码,如果文件中包含函数定义,则会编译该函数。3.调用函数编译后,即可调用:```idlresult=MyFunction(3,5)Print,result;输出8```注意事项:-函数文件必须位于IDL的工作目录中,或者位于IDL路径(由`!PATH`系统变量定义)中的目录。-如果函数有修改,需要重新编译才能生效。-函数可以没有输入参数,但必须至少有一个输出(通过`Return`返回),或者修改输入参数(通过引用传递)来输出结果。引用[2]中提到,函数最多有一个输出参数。这里的“输出参数”指的是通过函数返回值输出的参数。实际上,IDL函数可以通过两种方式输出数据:1.通过返回值(使用`Return`语句返回一个值)。2.通过修改输入参数(如果参数被定义为引用传递,即使用`ByRef`,但IDL默认情况下参数传递方式为值传递,除非使用特定的关键字如`REF`或`REF_EXTRA`等,但通常我们使用返回值)。因此,通常我们使用返回值来输出结果。示例:编写一个计算阶乘的函数。文件:factorial.pro```idlFunctionFactorial,n;计算n的阶乘result=1Fori=1,nDoresult=result*iReturn,resultEnd```在IDL中编译并调用:```idlIDL>.compile'factorial.pro'IDL>print,Factorial(5)120```§§相关问题§§1.IDL中如何传递多个返回值?2.IDL函数和过程的区别是什么?3.如何将自定义函数打包成IDL的SAV文件以便分发?4.在IDL中如何调试自定义函数?</think>### IDL 编译自定义函数的方法和步骤 在 IDL(Interactive Data Language)中编译自定义函数需遵循严格的语法规范。根据引用[2],函数必须以 `Function` 开头,以 `End` 结尾,且最多有一个输出参数。以下是详细步骤: #### 1. **创建函数文件(.pro 文件)** - 新建文本文件,命名格式:`函数名.pro`(例如 `my_function.pro`) - 函数结构必须包含: ```idl Function 函数名, 输入参数 ; 函数逻辑代码 Return, 输出值 ; 最多一个输出 End ``` **示例**(计算平方的函数): ```idl Function Square, x ; 返回输入值的平方 result = x * x Return, result End ``` #### 2. **编译函数** 在 IDL 命令行中执行: ```idl .COMPILE 'my_function.pro' ; 编译文件 ``` - 成功编译后,IDL 会提示:`% Compiled module: SQUARE.` #### 3. **调用函数** ```idl y = Square(4) ; 调用函数 Print, y ; 输出 16.0000 ``` #### 4. **关键注意事项** - **文件位置**:.pro 文件需在 IDL 工作目录或 `!PATH` 定义的路径中 - **命名一致**:函数名必须与文件名一致(不区分大小写) - **重新编译**:修改函数后需重新执行 `.COMPILE` - **错误排查**:若编译失败,使用 `.RUN -t` 跟踪错误 #### 5. **多函数管理** 若需编译多个函数: ```idl .COMPILE 'func1.pro', 'func2.pro' ; 批量编译 ``` #### 6. **实际应用示例** **温度转换函数**(华氏度转摄氏度): ```idl Function F2C, fahrenheit celsius = (fahrenheit - 32) * 5.0 / 9.0 Return, celsius End ``` 编译并调用: ```idl .COMPILE 'f2c.pro' Print, F2C(77) ; 输出 25.0000 ``` > **重要提示**:IDL 函数必须通过关联的 .pro 文件编译才能运行,且需确保语法严格符合规范[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值