如何在另一个中访问动态创建的类?

时间:2016-03-16 10:36:45

标签: ruby metaprogramming

我不知道如何在另一个中访问动态创建的类。这些类存储在局部变量中,我想避免使用常量,因为类是在方法中创建的。

def clazzes_and_clazzes
  clazz_one = Class.new do
    def one; 'one'; end
  end
  puts clazz_one.new.one

  clazz_two = Class.new do
    def two
      clazz_one.new.one + ' and ' + clazz_one.new.one
    end
  end
  puts clazz_two.new.two

  clazz_two
end

clazzes_and_clazzes

我期待以下输出。

$ ruby snippet.rb
one
one and one

但上面的代码段会引发以下错误消息。

snippet.rb:9:in `two': undefined local variable or method `clazz_one' for #<#<Class:0x7f2fa401af10>:0x7f2fa401ae98> (NameError)
    from snippet.rb:12:in `clazzes_and_clazzes'
    from snippet.rb:15

我该如何解决错误?

1 个答案:

答案 0 :(得分:3)

当您使用clazz_one关键字定义方法时,您不在定义def的范围内。相反,您可以使用define_method方法,它接受一个块,即闭包,因此它保留了本地范围:

define_method :two do
  clazz_one.new.one + ' and ' + clazz_one.new.one
end

在这里,您可以了解有关Ruby范围的更多信息: http://www.sitepoint.com/understanding-scope-in-ruby/