我刚刚开始学习Ruby并且很好地掌握了基础知识.我一直听说Ruby非常好的一个很酷的东西就是元编程,但我读过的教程都没有涵盖这一点.搜索谷歌我似乎只能找到红宝石元编程屏幕演员付费.
那么,我在哪里可以在线找到一个好的Ruby元编程教程?
请考虑以下代码:
template<bool AddMembers> class MyClass
{
public:
void myFunction();
template<class = typename std::enable_if<AddMembers>::type> void addedFunction();
protected:
double myVariable;
/* SOMETHING */ addedVariable;
};
Run Code Online (Sandbox Code Playgroud)
在此代码中,模板参数AddMembers允许在类中添加函数true.为此,我们使用了std::enable_if.
我的问题是:数据成员变量是否可能(可能有技巧)?(以这种方式,MyClass<false>将有1个数据成员(myVariable),MyClass<true>并将有2个数据成员(myVariable和addedVariable)?
试图在define_method里面使用initialize但得到undefined_method define_method.我究竟做错了什么?
class C
def initialize(n)
define_method ("#{n}") { puts "some method #{n}" }
end
end
C.new("abc") #=> NoMethodError: undefined method `define_method' for #<C:0x2efae80>
Run Code Online (Sandbox Code Playgroud) 我正在用Ruby编写内部DSL.为此,我需要以编程方式创建命名类和嵌套类.这样做的最佳方法是什么?我认为有两种方法可以做到这一点:
Class.new创建一个匿名类,然后使用define_method的方法添加到它,最后调用const_set将其添加为命名常量一些命名空间.eval我已经测试了第一种方式并且它有效,但是对Ruby来说是新手,我不确定将类作为常量是正确的方法.
还有其他更好的方法吗?如果没有,上述哪一项更可取?
想象一下,我们有一个可变的struct(是的,不要开始):
public struct MutableStruct
{
public int Foo { get; set; }
public override string ToString()
{
return Foo.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
使用反射,我们可以获取一个盒装实例,struct并在框内变异:
// this is basically what we want to emulate
object obj = new MutableStruct { Foo = 123 };
obj.GetType().GetProperty("Foo").SetValue(obj, 456);
System.Console.WriteLine(obj); // "456"
Run Code Online (Sandbox Code Playgroud)
我会喜欢做的是写一些IL可以做同样的,因为这-但速度更快.我是一个元编程迷; p
拆箱 - 任何值并使用常规IL改变值是微不足道的 - 但是你不能只是在之后调用它,因为这将创建一个不同的框.我猜我们需要做的是将它复制到现有的盒子上.我已经调查了ldobj/ stobj,但那些似乎没有做到这一点(除非我遗漏了什么).
那么:是否存在这样做的机制?或者我必须限制自己反思以执行盒装structs 的就地更新?
换句话说:什么... evil goes here...?
var method = …Run Code Online (Sandbox Code Playgroud) C ++ 20引入std::common_reference。目的是什么?有人可以举一个使用它的例子吗?
我想调试一些模板化代码以更好地理解它.
不幸的是,我是模板元编程的新手,我很难进入.
当我尝试输出预处理的源文件时,我获得了125 000行代码:/
那么我有没有办法看到生成的代码?(我正在使用的库是SeqAn)
编写函数(或DSLish)的最佳方法是什么,这将允许我在Ruby中编写此代码.我如何构造函数write_pair?
username = "tyndall"
write_pair username
# where write_pair username outputs
username: tyndall
Run Code Online (Sandbox Code Playgroud)
有可能吗?寻找最简单的方法来做到这一点.
我对在Ruby中动态设置局部变量感兴趣.不创建方法,常量或实例变量.
所以类似于:
args[:a] = 1
args.each_pair do |k,v|
Object.make_instance_var k,v
end
puts a
> 1
Run Code Online (Sandbox Code Playgroud)
我特别想要局部变量,因为所讨论的方法存在于模型中,我不想污染全局或对象空间.
什么是Python相当于Ruby的method_missing方法?我尝试过使用__getattr__但是这个钩子也适用于字段.我只想拦截方法调用.Python的方法是什么?