我在Ruby中做了一些元编程,我需要在模块中动态生成一个兄弟类.这样做,我想在模块上调用const_set,但我不知道在运行时调用哪个模块常量.一个例子:
鉴于课程
Foo::Bar::Baz
Foo::Quox::Quack
Run Code Online (Sandbox Code Playgroud)
我想能够调用这样的函数(在这里过于简化):
def generate_from klass
mod = klass.enclosing_module # <- THIS LINE is the one I need to figure out
mod.const_set("GeneratedClassName", Class.new)
end
Run Code Online (Sandbox Code Playgroud)
在调用时Baz
,我最终想要的是一个定义为的新类
Foo::Bar::GeneratedClassName
Run Code Online (Sandbox Code Playgroud)
我想要一个嘎嘎
Foo::Quox::GeneratedClassName
Run Code Online (Sandbox Code Playgroud)
我知道的唯一方法是拆分klass.name,然后在这些字符串上反复调用const_get,并进行实例化.有谁知道更优雅的方式?
我有一个类,我希望将工厂方法放在基于两种构造方法之一的新实例上:它可以从内存中的数据构建,也可以由存储在文件中的数据构建.
我想要做的是封装在类中执行构造的逻辑,所以我希望有这样设置的静态类方法:
class MyAppModel
def initialize
#Absolutely nothing here - instances are not constructed externally with MyAppModel.new
end
def self.construct_from_some_other_object otherObject
inst = MyAppModel.new
inst.instance_variable_set("@some_non_published_var", otherObject.foo)
return inst
end
def self.construct_from_file file
inst = MyAppModel.new
inst.instance_variable_set("@some_non_published_var", get_it_from_file(file))
return inst
end
end
Run Code Online (Sandbox Code Playgroud)
有没有办法在类的实例上设置@some_private_var而不依赖于元编程(instance_variable_set)?看起来这种模式并不是那么深奥,以至于需要将meta-poking变量放入实例中.我真的不打算允许MyAppModel之外的任何类访问some_published_var,所以我不想使用例如attr_accessor - 它只是感觉我错过了一些东西......
我有一种情况,我想在Ruby中运行多个EventMachines - 有没有人有这方面的经验?(如果没有,我可以自己写一个测试用例.请继续关注).
让我们明确一点:我想自己实例化两个线程,并调用EventMachine.run
两个线程,所以我真的有两个反应器循环.
原因是我正在使用AMQP gem编写异步消息总线,它使用EventMachine.这很好,但我想把它作为一个单独的模块化组件,可以在两个应用程序中使用:
有人有想法吗?
我正在编写一个小型库,它可以在输入参数超出范围时执行一些可能会抛出异常的事情.看起来很简单,我会抛出一个std :: out_of_range.
我还想生成一个很好的消息,例如"你给了我X但Y是范围内的最大值" - 即我正在格式化一个字符串并希望将其用于异常.
奇怪的是构造函数的签名是
explicit out_of_range (const string& what_arg)
也就是说,它需要对字符串进行const引用.当我们弹出函数时,我在堆栈上创建的任何字符串都将被销毁,从而为异常的捕获者留下一堆垃圾.所以我只有几个选择:
我倾向于3是最不重要的,可以说是比直接使用标准类更好的设计,但我不得不问:是否真的没有办法直接使用标准的out_of_range类生成的字符串?我错过了什么吗?
之前boost::shared_ptr
,从函数返回堆分配指针被认为是一种不好的做法,因为调用者需要记住free()
该对象吗?
或者,它被认为是"正常"?