【问题标题】:How to parametrize a class in Ruby如何在 Ruby 中对类进行参数化
【发布时间】:2017-02-10 18:22:42
【问题描述】:

我正在尝试移植此模式以参数化从 Python 到 Ruby 的类:https://github.com/prometheus/client_python/blob/6a8d85e5f64935b6c2a409291e9f6578a7bfe1b0/prometheus_client/core.py#L395-L434

外部方法设置一些变量,然后在内部定义一个关闭这些值的类。结果是从这个返回的类创建的所有对象都共享一些公共状态。

我不能在 Ruby 中这样做,因为 Ruby 不允许在方法中定义类:

def foo
  class Bar
  end
end

这会产生错误:class definition in method body

在 Ruby 中执行此操作的正确方法是什么?

【问题讨论】:

  • “Ruby 不允许在方法中定义类”——这是为什么呢?完全允许。
  • 尝试在方法中定义一个类给我以下错误:“方法体中的类定义”。
  • 请问,您看过本站的规则吗?请发布您尝试运行的代码,发布您收到的错误消息,我将能够显示问题所在。

标签: python ruby


【解决方案1】:

如果你想在 Ruby 中动态创建一个类,你可以。但是,您不能在方法内定义常量,至少不能以通常的方式。请参阅thoseanswers 了解更多信息。

def create_class(methods = {})
  klass = Class.new
  methods.each do |method_name, value|
    klass.send(:define_method, method_name) do
      value
    end
  end
  klass
end

my_class = create_class a: 'Hello', b: 'World'
my_instance = my_class.new
puts my_instance.a
#=> "Hello"
puts my_instance.b
#=> "World"

【讨论】:

  • 谢谢!我希望在 Ruby 中实现同样的效果可能会有一个不那么笨拙的模式,但这应该可行!
猜你喜欢
  • 2013-06-16
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多