gpt4 book ai didi

ruby-on-rails - 如何替换 Rails 控制台中的现有类?

转载 作者:数据小太阳 更新时间:2023-10-29 08:33:25 24 4
gpt4 key购买 nike

在控制台中:

class Logger
end
l = Logger.new

抛出错误:ArgumentError:参数数量错误(0 代表 1)
来自/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 中的 Logger?

最佳答案

我会尝试回答您的第二个问题。那么,为什么 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 类这一事实,您的定义仅重新打开该类,但甚至不会更改任何内容。

关于ruby-on-rails - 如何替换 Rails 控制台中的现有类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11416135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com