`
qiezi
  • 浏览: 497936 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何获得一个方法的名字?

    博客分类:
  • D
阅读更多
在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不能获得它的名字,这点和C++相似。

不过今天看到PyD的一个例子:

import pyd.pyd;
import std.stdio;

void hello_func() {
    writefln("Hello, world!");
}

extern (C) void PydMain() {
    def!(hello_func);
    module_init();
}


>>> import testdll
>>> testdll.hello_func()
Hello, world!


看到什么了?它如何能获取hello_func这个名字?而在python扩展中使用?

D语言各种类型都有一个mangleof属性,返回一个经过mangling过的名字,如果你在链接一个程序时提示找不到符号,可能会遇到这个,比如“PFC3eee42__T19mangle_helper_classS14_D3eee4testFZvZ19mangle_helper_classZv”这个名字就是经过编译器mangling过的。

简单追踪代码,发现它在meta包里实现了一些功能,其中有个叫 manglenameof,可以获取方法名字。没有简单方法获取吗?

简单测试一下:
void test(){}

发现test.mangleof返回的是"v",也就是 void类型这实际上是test方法调用后的类型,不过并不真的调用test方法,而是和sizeof一样,在编译器决议出来,它和(test()).mangleof是等价的。(&test).mangleof则返回"PFZv",根本不包含名字信息。

接下来测试的是2种,模板类和模板方法:
class mangle_helper_class(alias A){
}

void mangle_helper_func(alias A)(){
}

直接实例化:
writefln((&mangle_helper_func!(test)).mangleof);
writefln((mangle_helper_class!(test)).mangleof);

第2种是可以获取到的,在我这里它返回的名字是“C3eee42__T19mangle_helper_classS14_D3eee4testFZiZ19mangle_helper_class”

只要把不相关的名字抹掉就可以得到test。不过pyd使用了一个更麻烦的:
class mangle_helper_class(alias A){
}

void mangle_helper(alias A)(mangle_helper_class!(A)){

}

template manglenameof(alias A){
    const char[] manglenameof = (&mangle_helper!(A)).mangleof;
}

也可以获取。

对于D这种元信息十分贫乏的语言来说,能够做到这个已经很不容易了。
分享到:
评论
1 楼 imagex 2007-02-10  
前几天看到你们讨论D和Java的性能,其实D比Java不是快一点点:
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=dlang&lang2=java

相关推荐

    C#实现根据指定容器和控件名字获得控件的方法

    因此,我们需要编写一个方法,能够遍历这个树结构,直到找到具有指定名字的控件。 下面是一个实现这个功能的C#代码片段: ```csharp private object GetControlInstance(object obj, string strControlName) { ...

    编写一个JAVA程序,定义一个Student类

    方法public String toString(),把Student类的对象的所有属性信息组合成一个字符串以便输出显示。编写一个Java Application程序,创建Student类的对象,调用上述方法进行验证并实现相应输出。

    问题22-文件name.txt中所有名字得分的总和是多少?

    为了提高代码的可读性和可维护性,可以考虑将计分逻辑封装在一个函数中,输入一个名字,返回其得分。 标签 "源码 工具" 暗示了解决方案可能涉及查看或编写源代码,并可能利用一些工具来辅助分析或自动化这个过程。...

    计算机网络常见问题解答

    当TCP发送第一个SYN报文段时,显然无法利用教材中5.6.3节所介绍的方法计算往返时间RTT。那么这时TCP又怎样设置重传计时器呢? 问题5-12:糊涂窗口综合症产生的条件是什么?是否只有在接收方才产生这种症状? 问题5-...

    java-servlet-api.doc

    init()方法获得了一个Servlet配置对象(ServletConfig)。这个对象在Servlet引擎中执行,并允许Servlet通过它获处相关参数。这个对象使得Servlet能够访问ServletContext对象。 Servlet处理请求\r Servlet被初始化...

    android webview中使用Java调用JavaScript方法并获取返回值

    如果需要在WebView中启用JavaScript调用Android代码的功能,还要在addJavascriptInterface()方法中声明一个Java类的实例,并为其指定一个可以在JavaScript中访问的接口名字。 在Java代码中定义一个内部类,用于接收...

    java随机生成一个名字和对应拼音的方法

    以下是一个关于如何在Java中随机生成一个名字和其对应拼音的方法的详细解释。 首先,我们可以创建一个名为`ChineseName`的类,该类包含了两个字符串数组:`sName`和`Name`。`sName`数组用于存储名字及其对应的拼音...

    javascript获取指定节点父节点、子节点的方法

    2. document.getElementsByName(elementName):该方法是通过节点的 name 获取节点,从名字可以看出,这个方法返回的不是一个节点元素,而是具有同样名称的节点数组。然后,我们可以通过要获取节点的某个属性来循环...

    PHP 面向对象技术(全面讲解).txt

    一个项目要用到多少个类,用多少个对象,在那要定义类,定义 一个什么样的类,这个类实例化出多少个对象,类里面有多少个属性,有多少个方法等等,这就需 要读者通过在实际的开发中就实际问题分析设计和总结了。 类的...

    你必须知道的495个C语言问题

    5.2 怎样在程序里获得一个空指针? 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? NULL宏 5.4 NULL是什么,它是怎么定义的? 5.5 在使用非零位模式作为空指针的内部...

    谢姓宝宝大气好听的名字取名方法.docx

    对于谢姓宝宝来说,选取一个大气、好听的名字更显得尤为重要。以下是一些具体的方法和建议: 1. **以出生地点起名**:这种取名方式能体现孩子与特定地方的联系,例如京生、粤生、台生等,象征着孩子与祖国大地的...

    Java设计一个银行帐户类(继承与多态)

    Java的继承机制允许一个类(如`BCOption`)继承另一个类(如`BankCount`),从而获得被继承类的所有非私有属性和方法。这里虽然没有明确的继承关系,但可以通过组合(Composition)的方式复用`BankCount`类的功能。...

    JAVA WEB框架,java网站一个模块只用写一个文件

    |___Szdw.java POJO类,对应数据库中szdw表(名字一致),里面所有成员变量都对应数据库表中一个字段。 |___SzdwServlet.java 用户自己写的servlet,在public class 上面一行有如下说明:@WebServlet(name = ...

    C语言FAQ 常见问题列表

    o 6.2 怎样在程序里获得一个空指针? o 6.3 用缩写的指针比较 ``if(p)" 检查空指针是否可靠?如果空指针的内部表达不是 0 会怎么样? o 6.4 NULL 是什么, 它是怎么定义的? o 6.5 在使用非全零作为空指针内部...

    操作系统基础:1 .在 Windows 中如何获得帮助? 答: 用户获得帮助的方法很多,主要有以下几种方法: ( 1 )在桌

    4. 文件命名协议:文件名不能在同一个文件夹内重复,长度限制为255个字符,可以包含数字和空格,但不能使用特殊字符如?、*、"、<、>、\、/、:。 5. 回收站的用途:回收站是一个特殊的硬盘区域,用于暂时存放被删除...

    两种OpenGL拾取 名字栈拾取 射线拾取 源码注释

    在该方法中,每个图形对象都有一个唯一的ID,当渲染时,这些ID被存储在一个叫做名字栈的堆栈中。当用户点击屏幕时,OpenGL会回溯名字栈,找到与鼠标点击位置对应的颜色ID,从而确定被选中的对象。这种方法的优点是...

    《你必须知道的495个C语言问题》

    5.2 怎样在程序里获得一个空指针? 54 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? 55 NULL 宏 56 5.4 NULL是什么,它是怎么定义的? 56 5.5 在使用非零位模式...

    HTML5技术秀:你的3D立体旋转名字

    接下来,我们需要一个用户界面,让用户输入他们的名字和设置旋转角度。这可以通过HTML表单实现,包含输入字段和两个滑块,一个用于调整X轴旋转,另一个用于Y轴旋转。JavaScript事件监听器将捕获这些输入,更新Matrix...

    jbpm安装及使用方法

    作为选择,你可以实现DecisionHandler接口,它有一个decide()方法,该方法返回一个String(leaving transition的名字)。 4)fork fork节点把一条执行路径分离成多条同时进行(并发)的执行路径,每条离开fork节点的...

Global site tag (gtag.js) - Google Analytics