你知道是否有一个内置函数来从任意对象构建一个字典?我想做这样的事情:
>>> class Foo:
... bar = 'hello'
... baz = 'world'
...
>>> f = Foo()
>>> props(f)
{ 'bar' : 'hello', 'baz' : 'world' }
Run Code Online (Sandbox Code Playgroud)
注意:它不应包括方法.只有字段.
我想将一个参数传递给使用define_method定义的方法,我该怎么做?
我怎么能在这里做他们正在谈论的事情,但是在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未列出的地方.
从这样的事情:
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
缩进级别.这将是在我的终端上进行可读输出的快速方法.
有没有更好的方法来避免辛苦的手动格式化?
给定一个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++编译时创建和操作字符串有几个有用的应用程序.尽管可以在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) 我试图从类对象本身获取类的字符串名称.
// For instance
[NSArray className]; // @"NSArray"
Run Code Online (Sandbox Code Playgroud)
我发现object_getClassName(id obj)
但是需要将一个实例传递给它,在我的情况下这是不必要的工作.
那么如何从类对象中获取字符串,而不是实例呢?
在最近的一次采访中,我被问到一个非常奇怪的问题.面试官问我如何使用编译器功能计算1 + 2 + 3 + ... + 1000.这意味着我不允许编写程序并执行它,但我应该编写一个程序,可以驱动编译器在编译时计算这个总和,并在编译完成时打印结果.作为提示,他告诉我,我可能会使用编译器的泛型和预处理器功能.可以使用C++,C#或Java编译器.有任何想法吗???
这个问题与计算总和无关,这里没有任何循环问题.此外,应该注意,总和应该在编译期间计算.不能使用C++编译器指令打印结果.
阅读更多关于发布的答案,我发现在使用C++模板编译期间解决问题称为元编程.这是Erwin Unruh博士在标准化C++语言过程中偶然发现的一种技术.您可以在元编程的wiki页面上阅读有关此主题的更多信息.似乎可以使用Java注释在Java中编写程序.您可以在下面看看maress的答案.
关于C++的元编程一个很好的书是这一个.如果感兴趣,值得一看.
一个有用的C++元编程库是Boost的MPL 这个链接.
我知道如何通过执行以下操作为名称已知的属性创建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?
不用说,我理想地喜欢跨浏览器兼容的解决方案.
metaprogramming ×10
c++ ×3
reflection ×3
ruby ×3
c++11 ×2
python ×2
attributes ×1
c# ×1
dictionary ×1
indentation ×1
java ×1
javascript ×1
lambda ×1
object ×1
objective-c ×1
string ×1
tokenize ×1
traits ×1