标签: metaprogramming

来自对象字段的Python字典

你知道是否有一个内置函数来从任意对象构建一个字典?我想做这样的事情:

>>> class Foo:
...     bar = 'hello'
...     baz = 'world'
...
>>> f = Foo()
>>> props(f)
{ 'bar' : 'hello', 'baz' : 'world' }
Run Code Online (Sandbox Code Playgroud)

注意:它不应包括方法.只有字段.

python attributes dictionary metaprogramming object

309
推荐指数
13
解决办法
33万
查看次数

获取当前正在执行的方法的名称

$0 是顶级Ruby程序的变量,但当前方法有一个吗?

ruby reflection metaprogramming

190
推荐指数
4
解决办法
6万
查看次数

如何将参数传递给define_method?

我想将一个参数传递给使用define_method定义的方法,我该怎么做?

ruby metaprogramming

151
推荐指数
4
解决办法
6万
查看次数

使用Ruby中的方法名称从字符串调用方法

我怎么能在这里做他们正在谈论的事情,但是在Ruby中呢?

你会如何对对象执行此功能?你将如何做一个全局函数(参见jetxee 在上述帖子中的回答)?

示例代码:

event_name = "load"

def load()
  puts "load() function was executed."
end

def row_changed()
  puts "row_changed() function was executed."
end 

#something here to see that event_name = "load" and run load()
Run Code Online (Sandbox Code Playgroud)

更新: 你如何得到全球方法?还是我的全球职能?

我试过这个额外的一行

puts methods
Run Code Online (Sandbox Code Playgroud)

和load和row_change未列出的地方.

ruby metaprogramming

151
推荐指数
3
解决办法
9万
查看次数

一行Python代码可以知道它的缩进嵌套级别吗?

从这样的事情:

print(get_indentation_level())

    print(get_indentation_level())

        print(get_indentation_level())
Run Code Online (Sandbox Code Playgroud)

我想得到这样的东西:

1
2
3
Run Code Online (Sandbox Code Playgroud)

代码可以用这种方式读取自己吗?

我想要的是更嵌套的代码嵌套部分的输出.与使代码更易于阅读的方式相同,它将使输出更易于阅读.

当然,我可以手动实现,例如.format(),但我想到的是一个自定义打印功能,print(i*' ' + string)其中i缩进级别.这将是在我的终端上进行可读输出的快速方法.

有没有更好的方法来避免辛苦的手动格式化?

python reflection metaprogramming indentation tokenize

146
推荐指数
5
解决办法
7260
查看次数

是否有可能找出lambda的参数类型和返回类型?

给定一个lambda,是否可以找出它的参数类型和返回类型?如果有,怎么样?

基本上,我想要lambda_traits哪些可以用于以下方式:

auto lambda = [](int i) { return long(i*10); };

lambda_traits<decltype(lambda)>::param_type  i; //i should be int
lambda_traits<decltype(lambda)>::return_type l; //l should be long
Run Code Online (Sandbox Code Playgroud)

背后的动机是我想lambda_traits在一个接受lambda作为参数的函数模板中使用,我需要知道它的参数类型和函数内部的返回类型:

template<typename TLambda>
void f(TLambda lambda)
{
   typedef typename lambda_traits<TLambda>::param_type  P;
   typedef typename lambda_traits<TLambda>::return_type R;

   std::function<R(P)> fun = lambda; //I want to do this!
   //...
}
Run Code Online (Sandbox Code Playgroud)

目前,我们可以假设lambda只接受一个参数.

最初,我尝试使用std::function:

template<typename T>
A<T> f(std::function<bool(T)> fun)
{
   return A<T>(fun);
}

f([](int){return true;}); //error
Run Code Online (Sandbox Code Playgroud)

但它显然会给出错误.所以我将其更改TLambda为函数模板的版本,并希望在函数std::function内部构造对象(如上所示).

c++ lambda metaprogramming traits c++11

133
推荐指数
3
解决办法
3万
查看次数

在C++中方便地声明编译时字符串

能够在C++编译时创建和操作字符串有几个有用的应用程序.尽管可以在C++中创建编译时字符串,但是该过程非常麻烦,因为字符串需要声明为可变字符序列,例如

using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>;
Run Code Online (Sandbox Code Playgroud)

诸如字符串连接,子字符串提取等许多操作可以很容易地实现为对字符序列的操作.是否可以更方便地声明编译时字符串?如果没有,是否有一个提案可以方便地声明编译时字符串?

为什么现有方法失败

理想情况下,我们希望能够如下声明编译时字符串:

// Approach 1
using str1 = sequence<"Hello, world!">;
Run Code Online (Sandbox Code Playgroud)

或者,使用用户定义的文字,

// Approach 2
constexpr auto str2 = "Hello, world!"_s;
Run Code Online (Sandbox Code Playgroud)

哪里decltype(str2)有一个constexpr构造函数.方法1的混乱版本可以实现,利用您可以执行以下操作的事实:

template <unsigned Size, const char Array[Size]>
struct foo;
Run Code Online (Sandbox Code Playgroud)

但是,数组需要有外部链接,所以要使方法1起作用,我们必须编写如下内容:

/* Implementation of array to sequence goes here. */

constexpr const char str[] = "Hello, world!";

int main()
{
    using s = string<13, str>;
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ string metaprogramming user-defined-literals c++11

131
推荐指数
8
解决办法
6万
查看次数

Objective-C类 - >字符串如:[NSArray className] - > @"NSArray"

我试图从类对象本身获取类的字符串名称.

// For instance
[NSArray className]; // @"NSArray"
Run Code Online (Sandbox Code Playgroud)

我发现object_getClassName(id obj)但是需要将一个实例传递给它,在我的情况下这是不必要的工作.

那么如何从类对象中获取字符串,而不是实例呢?

reflection metaprogramming objective-c objective-c-runtime

128
推荐指数
1
解决办法
6万
查看次数

如何驱动C#,C++或Java编译器在编译时计算1 + 2 + 3 + ... + 1000?

在最近的一次采访中,我被问到一个非常奇怪的问题.面试官问我如何使用编译器功能计算1 + 2 + 3 + ... + 1000.这意味着我不允许编写程序并执行它,但我应该编写一个程序,可以驱动编译器在编译时计算这个总和,并在编译完成时打印结果.作为提示,他告诉我,我可能会使用编译器的泛型和预处理器功能.可以使用C++,C#或Java编译器.有任何想法吗???

这个问题与计算总和无关,这里没有任何循环问题.此外,应该注意,总和应该在编译期间计算.不能使用C++编译器指令打印结果.


阅读更多关于发布的答案,我发现在使用C++模板编译期间解决问题称为元编程.这是Erwin Unruh博士在标准化C++语言过程中偶然发现的一种技术.您可以在元编程的wiki页面上阅读有关此主题的更多信息.似乎可以使用Java注释在Java中编写程序.您可以在下面看看maress的答案.

关于C++的元编程一个很好的书是这一个.如果感兴趣,值得一看.

一个有用的C++元编程库是Boost的MPL 这个链接.

c# c++ java compiler-construction metaprogramming

121
推荐指数
9
解决办法
8407
查看次数

是否可以在JavaScript中实现动态getter/setter?

我知道如何通过执行以下操作为名称已知的属性创建getter和setter:

// A trivial example:
function MyObject(val){
    this.count = 0;
    this.value = val;
}
MyObject.prototype = {
    get value(){
        return this.count < 2 ? "Go away" : this._value;
    },
    set value(val){
        this._value = val + (++this.count);
    }
};
var a = new MyObject('foo');

alert(a.value); // --> "Go away"
a.value = 'bar';
alert(a.value); // --> "bar2"
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是,是否有可能定义这些全能的吸气剂和定型器?即,创建getter和setter的任何属性名称是不是已经定义.

这个概念可以在PHP中使用__get()__set()魔术方法(请参阅PHP文档以获取有关这些的信息),所以我真的要问是否有与这些相当的JavaScript?

不用说,我理想地喜欢跨浏览器兼容的解决方案.

javascript metaprogramming getter-setter

119
推荐指数
3
解决办法
5万
查看次数