`
qiezi
  • 浏览: 491509 次
  • 性别: 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

相关推荐

    计算机网络常见问题解答

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

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

    主要介绍了C#实现根据指定容器和控件名字获得控件的方法,其中包括了遍历与递归的应用,需要的朋友可以参考下

    java-servlet-api.doc

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

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

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

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

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

    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 在使用非全零作为空指针内部...

    Java测试题4答案

    提示:Die类表示一个骰子有faceValue一个静态属性,有一个roll()方法getFaceValue()。 roll()方法使faceValue为1~6中的一个随机值。getFaceValue()是取出faceValue值。 2)然后定义DiceGame类。 提示:...

    JAVA面试题最全集

    选择树的一个节点时,如何得到这个节点? 70.向编辑框中输入字符时,如何控制只输入整数? 71.描述使用JDBC连接数据库的过程 72.EJB分为几类?什么是BMP,CMP? 73.什么是JNDI? 74.ADO是什么?ActiveX数据对象,是...

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

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

    jbpm安装及使用方法

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

    java 类的相关代码

    编写能够满足如下条件的程序: ...2 声明一个Shape接口,其中有计算面积(area)、周长(perimeter)的方法,有以下几个实现:Circle(圆),Rectangle(矩形),Triangle(三角形),都有计算面积、周长的方法。

    Unix编程常见问题解答 高清PDF含书签目录

    我怎样得到一个更细分时间单位的alarm函数版本(译者注:希望alarm 的时间小于一秒)? 1.5 How can a parent and child process communicate? 父子进程如何通信? 1.6 How do I get rid of zombie processes? 我怎样...

    超级有影响力霸气的Java面试题大全文档

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...

    套接字客户端和服务器java代码

    如果创建了一个Socket对象,那么它可能通过调用Socket的 getInputStream()方法从服务程序获得输入流读传送来的信息,也可能通过调用Socket的 getOutputStream()方法获得输出流来发送消息。在读写活动完成之后,客户...

    VC++ 专家指导.doc

    但是当我显示该对话框时,第一个编辑框总是不能获得焦点,我必须单击它来使它获得焦点。我怎样才能使第一个编辑框在对话框打开时就获得焦点? 71 (93) 我怎样才能使一个窗口具有“always on top”特性? 71 (94) 我...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    10.2.3 记得给类一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 ...

    《Java程序设计》课程实验指导书程序代码(答案)(实验三)

    public属性有x和y,方法有显示点坐标 show(),构造函数有两个参数分别给x,y赋值,在main方法中构造两个对象,再创建一方法(getMiddle)为取两个点构成线段的中点的坐标,参数为2个点对象,调用此方法后得到一个新的...

Global site tag (gtag.js) - Google Analytics