2017-02-10 2 views
0

Я пытаюсь перенести этот шаблон параметризовать класс от Python для Ruby: https://github.com/prometheus/client_python/blob/6a8d85e5f64935b6c2a409291e9f6578a7bfe1b0/prometheus_client/core.py#L395-L434Как параметризовать класс в Рубине

Наружный метод устанавливает некоторые переменные, а затем внутренне определяет класс, который закрывает над этими значениями. В результате все объекты, созданные из этого возвращенного класса, имеют общее общее состояние.

Я не могу сделать это в Ruby, потому что Руби не позволяет определений классов методов:

def foo 
    class Bar 
    end 
end 

Это дает ошибку: class definition in method body.

Каков правильный способ сделать это в Ruby?

+0

«Ruby не допускает определения классов в методах» - почему? Прекрасно допускает. – mudasobwa

+1

Попытка определить класс в методе дает мне следующую ошибку: «определение класса в теле метода». – Julius

+2

Извините, вы когда-нибудь читали правила этого сайта? Отправьте код, который вы пытались запустить, после сообщения об ошибке, которое вы получили, и я смогу показать, что не так. – mudasobwa

ответ

3

Если вы хотите динамически создавать класс в 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" 
+0

Спасибо! Я надеялся, что в Ruby, возможно, будет меньше шаблона клоди, но это должно сработать! – Julius

Смежные вопросы