[英]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.