在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 在使用非零位模式作为空指针的内部...
对于谢姓宝宝来说,选取一个大气、好听的名字更显得尤为重要。以下是一些具体的方法和建议: 1. **以出生地点起名**:这种取名方式能体现孩子与特定地方的联系,例如京生、粤生、台生等,象征着孩子与祖国大地的...
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...
作为选择,你可以实现DecisionHandler接口,它有一个decide()方法,该方法返回一个String(leaving transition的名字)。 4)fork fork节点把一条执行路径分离成多条同时进行(并发)的执行路径,每条离开fork节点的...