0

我试图通过打开类的特征类来动态取消定义方法。我想要类似的东西:

def remove_defined_mock_name_method(name)
  if Settings.respond_to?(name)
    class << Settings
      remove_method name
    end
  end
end

其中“名称”是一个符号。问题是重新打开的班级无法使用名称。如何通过方法调用来动态取消定义类方法?

对于那些好奇的人,用例是我想在 rspec for rails 中的每次测试之后取消定义动态定义的方法。

4

1 回答 1

1

name是一个局部变量。局部变量在定义它们的范围内是局部的,这就是它们被称为局部变量的原因。Ruby 中创建嵌套范围的唯一构造是块,因此如果您想访问 ,则必须使用块name,即使用class_eval或类似的东西。

但在这种情况下,这不是必需的:

def remove_defined_mock_name_method(name)
  Settings.singleton_class.send(:remove_method, name) if Settings.respond_to?(name)
end
于 2012-08-25T13:12:12.517 回答