小编Mat*_*att的帖子

Ruby:有没有办法获得一个类的封闭模块const?

我在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,并进行实例化.有谁知道更优雅的方式?

ruby metaprogramming

11
推荐指数
2
解决办法
8124
查看次数

Ruby中的类静态实例初始值设定项(即工厂方法)

我有一个类,我希望将工厂方法放在基于两种构造方法之一的新实例上:它可以从内存中的数据构建,也可以由存储在文件中的数据构建.

我想要做的是封装在类中执行构造的逻辑,所以我希望有这样设置的静态类方法:

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 static initialization

7
推荐指数
1
解决办法
5274
查看次数

一个进程中有多个Ruby EventMachines:可能吗?

我有一种情况,我想在Ruby中运行多个EventMachines - 有没有人有这方面的经验?(如果没有,我可以自己写一个测试用例.请继续关注).

让我们明确一点:我想自己实例化两个线程,并调用EventMachine.run两个线程,所以我真的有两个反应器循环.

原因是我正在使用AMQP gem编写异步消息总线,它使用EventMachine.这很好,但我想把它作为一个单独的模块化组件,可以在两个应用程序中使用:

  • 一个有自己的阻塞gui循环(无法通过调用来自EventMachine的tick来模拟 - 它真的阻塞,它在C库中执行,所以我不能破解它).这个很简单 - 只需在自己的线程中启动EM,并以线程安全的方式在循环之间共享传入的消息;
  • 和另一个本身在一个反应​​器循环中运行的应用程序,我可以与AMQP代码共享(这对于线程安全问题很好 - 尽管我必须为上述应用程序解决它们).这是让我思考的问题......我可以通过运行两个独立的EventMachines与上述应用程序共享消息总线代码吗?

有人有想法吗?

ruby eventmachine

7
推荐指数
1
解决办法
2046
查看次数

使用非文字字符串抛出out_of_range异常.什么是较小的邪恶?

我正在编写一个小型库,它可以在输入参数超出范围时执行一些可能会抛出异常的事情.看起来很简单,我会抛出一个std :: out_of_range.

我还想生成一个很好的消息,例如"你给了我X但Y是范围内的最大值" - 即我正在格式化一个字符串并希望将其用于异常.

奇怪的是构造函数的签名是

explicit out_of_range (const string& what_arg)

也就是说,它需要对字符串进行const引用.当我们弹出函数时,我在堆栈上创建的任何字符串都将被销毁,从而为异常的捕获者留下一堆垃圾.所以我只有几个选择:

  1. 使用字符串文字,因此没有很好的生成消息.它在程序的生命周期内有效.
  2. 在函数中使字符串为static,并在抛出时重写它.线程安全不是我的程序的问题,但这感觉很脏.
  3. 子类out_of_range以便它获取字符串的副本,并使用对副本的引用来调用超类构造函数,以便在异常对象的生命周期中存在该副本.

我倾向于3是最不重要的,可以说是比直接使用标准类更好的设计,但我不得不问:是否真的没有办法直接使用标准的out_of_range类生成的字符串?我错过了什么吗?

c++ exception

2
推荐指数
1
解决办法
143
查看次数

从函数返回堆分配指针是不礼貌的吗?

之前boost::shared_ptr,从函数返回堆分配指针被认为是一种不好的做法,因为调用者需要记住free()该对象吗?

或者,它被认为是"正常"?

c c++ pointers heap-memory

1
推荐指数
1
解决办法
1281
查看次数