簡體   English   中英

如何替換Rails控制台中的退出類?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM