[英]How to replace exiting class in Rails console?
在控制台中:
class Logger
end
l = Logger.new
引发错误: ArgumentError: wrong number of arguments (0 for 1) from /home/zzz/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/logger.rb:268:in 'initialize'
为什么在/home/zzz/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/logger.rb
使用记录器?
我将尝试回答您的第二个问题。 那么,为什么Ruby使用其他Logger
类而不是您尝试定义自己的类?
Ruby的基本功能之一是重新打开类。 假设您有一些已经在您的应用中定义并加载的类:
class A
def foo
puts 'foo'
end
end
A.new.foo
#=> foo
在那之后,如果Ruby解释器遇到类似这样的事情:
class A
def bar
puts 'bar'
end
end
它不会重新定义A
类,而只是将此定义附加到上一个定义。 在结果中,已定义的类A
获得新的实例方法bar
:
A.new.foo # still works
#=> foo
A.new.bar # new method
#=> bar
由于的方式处理的Ruby方法调用,该类的所有实例A
说是类的第二个定义(实际上,重开)初始化之前 A
也得到这种新方法bar
。 因此,每次您重新打开一个类时,都会向该类本身以及该类的所有先前初始化的实例中添加新功能。
重新打开类也可以重写现有类的方法:
class A
def foo
puts 'new foo'
end
end
A.new.foo
#=> new_foo
考虑到该功能以及Rails已经为您加载了标准Logger
类的事实,您的定义只会重新打开该类,甚至不会更改任何内容。
该类已经加载,可能是因为Rails正在使用它:您没有重新定义该类,只是在重新打开它。
您可以删除现有的课程
Object.send(:remove_const, :Logger)
在这种情况下,以前称为Logger
的类仍然存在,只是不再与常量Logger
绑定,因此当您执行
class Logger
end
您将创建一个新类,而不重新打开旧类。 当然,您可能最终破坏了假定存在旧Logger类的代码。
如果您在测试中执行此操作,则可能会对rspec 2.11中的新常量存根感兴趣
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.