Questions tagged «metaprogramming»

元编程是对宏或元类的编程环境进行重新编程的功能。

11
编译时间字符串哈希
我在几个不同的地方读到,使用C ++ 11的新字符串文字可能在编译时计算字符串的哈希值。但是,似乎没有人愿意提出来,说这将是可能的或如何实现的。 这可能吗? 操作员会是什么样子? 我对这样的用例特别感兴趣。 void foo( const std::string& value ) { switch( std::hash(value) ) { case "one"_hash: one(); break; case "two"_hash: two(); break; /*many more cases*/ default: other(); break; } } 注意:编译时哈希函数不必看起来像我写的那样。我尽力猜测最终的解决方案是什么样的,但meta_hash<"string"_meta>::value也可能是可行的解决方案。

2
获取给定名称的实例变量的值
通常,如何获得对字符串中具有其名称的对象的引用? 更具体地说,我有一个参数名称列表(成员变量-动态构建的,因此我不能直接引用它们)。 每个参数都是一个对象,也有一个from_s方法。 我想做类似以下的事情(这当然是行不通的……): define_method(:from_s) do | arg | @ordered_parameter_names.each do | param | instance_eval "field_ref = @#{param}" field_ref.from_s(param) end end


4
Ruby元编程:动态实例变量名称
假设我有以下哈希值: { :foo => 'bar', :baz => 'qux' } 我如何动态设置键和值以成为对象中的实例变量... class Example def initialize( hash ) ... magic happens here... end end ...这样我最终得到了模型中的以下内容... @foo = 'bar' @baz = 'qux' ?

4
Python类的__dict __.__ dict__属性是什么?
>>> class A(object): pass ... >>> A.__dict__ <dictproxy object at 0x173ef30> >>> A.__dict__.__dict__ Traceback (most recent call last): File "<string>", line 1, in <fragment> AttributeError: 'dictproxy' object has no attribute '__dict__' >>> A.__dict__.copy() {'__dict__': <attribute '__dict__' of 'A' objects> ... } >>> A.__dict__['__dict__'] <attribute '__dict__' of 'A' objects> # What …

30
使用Python与Ruby进行元编程[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我目前主要是D程序员,并且正在向我的工具箱中添加另一种语言,最好是一种支持元编程编程语言的工具,而这种编程语言只能用像D这样的静态编译语言来完成。 我已经阅读了一些有关Lisp的内容,我很想找到一种语言,该语言可以实现Lisp的一些出色功能,但是没有Lisp的奇怪语法等。我不想发动一场语言大战,并且我确定Ruby和Python都有它们的取舍,所以我将列出对我个人重要的内容。请告诉我Ruby,Python或其他语言对我来说是否最合适。 重要: 良好的元编程。能够在运行时创建类,方法,函数等。最好,代码和数据之间的区别最小,Lisp风格。 优美,干净,理智的语法和一致,直观的语义。基本上是一种经过深思熟虑,易于使用的现代语言。 多种范例。没有一个范例适合每个项目,甚至一个项目中的每个小子问题。 一种有趣的语言,实际上会影响人们对编程的思考方式。 有一些重要: 性能。如果性能不错,那就太好了,但是当性能是真正的优先事项时,我将改用D。 有据可查。 不重要: 社区的规模,图书馆的可用性等。这些都不是语言本身的特征,并且所有这些都可以很快改变。 职位空缺。我不是专职的程序员。我是一名研究生,编程与我的研究有切向的关系。 最初设计的任何功能都需要考虑到由一百万个代码猴子完成的大型项目。

6
在(函数式)编程的上下文中,“确定”和“确定”是什么意思?
我在关于haskell和函数式编程的博客中读了很多(特别是在sigfpe的博客中),但是我对它的含义一无所知。我大多数时候都不了解它,但是如果我知道的话,我可能会更好地理解这些文本。Google帮不了我。我迷失在技术方面。 同样,世界的非技术含义(“使抽象具体化”)也无法帮助我理解在代码中统一某些东西的实际含义。 我对计算机科学的概念有点慢,所以带有代码的实际示例将是不错的选择。:P

2
查找模块中可用的类
我有一个模块MyModule。我动态地将类加载到其中。如何获得在其命名空间中定义的类的列表? 例: def load_plugins Dir.glob(File.dirname(__FILE__) + '/plugins/*.rb') do |f| MyModule.class_eval File.read(f) end # now how can I find the new classes I've loaded into MyModule? end 我应该说每个都f包含类似“ Foo类;结束”的内容。 您也可以这样想:在Rails中,如何以编程方式找到ActiveRecord模块中定义的所有类?

4
具有类名称的动态类定义
如何在Ruby中使用名称动态定义类? 我知道如何动态地创建一个类,而不使用类似的名称: dynamic_class = Class.new do def method1 end end 但是您不能指定类名。我想用名称动态创建一个类。 这是我要执行的操作的示例,但是它实际上并不起作用。 (请注意,我不是在创建类的实例,而是在创建类定义) class TestEval def method1 puts "name: #{self.name}" end end class_name = "TestEval" dummy = eval("#{class_name}") puts "dummy: #{dummy}" dynamic_name = "TestEval2" class_string = """ class #{dynamic_name} def method1 end end """ dummy2 = eval(class_string) puts "dummy2: #{dummy2}" …

9
列出引用PostgreSQL中的表的存储函数
只是一个简单快速的问题:在PostgreSQL中,如果可能的话,如何仅使用SELECT语句使用表列出所有存储函数/存储过程的名称?如果简单的SELECT不足,我可以使用存储的函数。 我的问题与该其他问题有点类似,但是该其他问题是针对SQL Server 2005: 表中存储过程的列表 (可选)为此,您还如何列出以相同方式使用同一表的触发器和约束?

5
Ruby中的动态方法调用
据我所知,有三种方法可以在Ruby中动态调用方法: 方法1: s = SomeObject.new method = s.method(:dynamic_method) method.call 方法2: s = SomeObject.new s.send(:dynamic_method) 方法3: s = SomeObject.new eval "s.dynamic_method" 通过对它们进行基准测试,我确定了方法1迄今为止最快,方法2较慢,方法3迄今为止最慢。 我还发现,.call和.send都允许调用私有方法,而eval不会。 所以我的问题是:有没有理由使用.send或eval?为什么您不总是使用最快的方法?这些调用动态方法的方法还有什么其他区别?

11
元编程的用途是什么?
我读了: 维基百科 代码生成与元编程 元编程的艺术 在c2.com进行元编程 我承认元编程/代码生成背后的目的有些混乱。 有没有人提供在哪里使用元编程/代码生成的具体示例?更好的解释是为什么它比其他方法更好。 编辑:将蓟视为元编程吗?



3
仅对定义了功能的类型在功能模板内执行功能
我有一个函数模板,它接受许多不同的类型。在这些类型中,只有其中一种具有getInt()功能。因此,我希望代码仅针对该类型运行函数。请提出解决方案。谢谢 #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want this to be called …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.