在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这种元信息十分贫乏的语言来说,能够做到这个已经很不容易了。
分享到:
相关推荐
因此,我们需要编写一个方法,能够遍历这个树结构,直到找到具有指定名字的控件。 下面是一个实现这个功能的C#代码片段: ```csharp private object GetControlInstance(object obj, string strControlName) { ...
方法public String toString(),把Student类的对象的所有属性信息组合成一个字符串以便输出显示。编写一个Java Application程序,创建Student类的对象,调用上述方法进行验证并实现相应输出。
为了提高代码的可读性和可维护性,可以考虑将计分逻辑封装在一个函数中,输入一个名字,返回其得分。 标签 "源码 工具" 暗示了解决方案可能涉及查看或编写源代码,并可能利用一些工具来辅助分析或自动化这个过程。...
当TCP发送第一个SYN报文段时,显然无法利用教材中5.6.3节所介绍的方法计算往返时间RTT。那么这时TCP又怎样设置重传计时器呢? 问题5-12:糊涂窗口综合症产生的条件是什么?是否只有在接收方才产生这种症状? 问题5-...
init()方法获得了一个Servlet配置对象(ServletConfig)。这个对象在Servlet引擎中执行,并允许Servlet通过它获处相关参数。这个对象使得Servlet能够访问ServletContext对象。 Servlet处理请求\r Servlet被初始化...
在人教版四年级语文的课堂上,教师将带领学生们深入学习一篇感人的课文——《同一个名字》。本篇课文不仅是一篇文学作品,更是一堂生动的人生课,它向学生们展示了一个名为沃尔特的人物是如何在工友间赢得了深厚的...
如果需要在WebView中启用JavaScript调用Android代码的功能,还要在addJavascriptInterface()方法中声明一个Java类的实例,并为其指定一个可以在JavaScript中访问的接口名字。 在Java代码中定义一个内部类,用于接收...
以下是一个关于如何在Java中随机生成一个名字和其对应拼音的方法的详细解释。 首先,我们可以创建一个名为`ChineseName`的类,该类包含了两个字符串数组:`sName`和`Name`。`sName`数组用于存储名字及其对应的拼音...
2. document.getElementsByName(elementName):该方法是通过节点的 name 获取节点,从名字可以看出,这个方法返回的不是一个节点元素,而是具有同样名称的节点数组。然后,我们可以通过要获取节点的某个属性来循环...
一个项目要用到多少个类,用多少个对象,在那要定义类,定义 一个什么样的类,这个类实例化出多少个对象,类里面有多少个属性,有多少个方法等等,这就需 要读者通过在实际的开发中就实际问题分析设计和总结了。 类的...
5.2 怎样在程序里获得一个空指针? 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? NULL宏 5.4 NULL是什么,它是怎么定义的? 5.5 在使用非零位模式作为空指针的内部...
Java的继承机制允许一个类(如`BCOption`)继承另一个类(如`BankCount`),从而获得被继承类的所有非私有属性和方法。这里虽然没有明确的继承关系,但可以通过组合(Composition)的方式复用`BankCount`类的功能。...
|___Szdw.java POJO类,对应数据库中szdw表(名字一致),里面所有成员变量都对应数据库表中一个字段。 |___SzdwServlet.java 用户自己写的servlet,在public class 上面一行有如下说明:@WebServlet(name = ...
o 6.2 怎样在程序里获得一个空指针? o 6.3 用缩写的指针比较 ``if(p)" 检查空指针是否可靠?如果空指针的内部表达不是 0 会怎么样? o 6.4 NULL 是什么, 它是怎么定义的? o 6.5 在使用非全零作为空指针内部...
4. 文件命名协议:文件名不能在同一个文件夹内重复,长度限制为255个字符,可以包含数字和空格,但不能使用特殊字符如?、*、"、<、>、\、/、:。 5. 回收站的用途:回收站是一个特殊的硬盘区域,用于暂时存放被删除...
学生在观察和欣赏这些作品时,不仅能够得到视觉上的享受,更重要的是能够从中获得灵感,学会如何在自己的创作中融入新颖的设计方法。这有助于学生超越传统的思维模式,找到自己独特的艺术表达方式。 进入第三幕...
在该方法中,每个图形对象都有一个唯一的ID,当渲染时,这些ID被存储在一个叫做名字栈的堆栈中。当用户点击屏幕时,OpenGL会回溯名字栈,找到与鼠标点击位置对应的颜色ID,从而确定被选中的对象。这种方法的优点是...
5.2 怎样在程序里获得一个空指针? 54 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? 55 NULL 宏 56 5.4 NULL是什么,它是怎么定义的? 56 5.5 在使用非零位模式...
接下来,我们需要一个用户界面,让用户输入他们的名字和设置旋转角度。这可以通过HTML表单实现,包含输入字段和两个滑块,一个用于调整X轴旋转,另一个用于Y轴旋转。JavaScript事件监听器将捕获这些输入,更新Matrix...