gpt4 book ai didi

ruby - 在 Ruby 中,如何在从文字创建的核心类的新对象中初始化实例变量

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

class Object
attr_reader :foo
def initialize
@foo = 'bar'
end
end

Object.new.foo # => 'bar'
''.foo # => nil
//.foo # => nil
[].foo # => nil

我希望他们都返回'bar'

我知道你已经可以这样做了:

class Object
def foo
'bar'
end
end

但是我特别想初始化一个状态变量。另请注意,这不起作用。

class String
alias_method :old_init, :initialize
def initialize(*args)
super
old_init(*args)
end
end

class Object
attr_reader :foo
def initialize
@foo = 'bar'
super
end
end

''.foo # => nil

这也不行:

class String
attr_reader :foo
def initialize
@foo = 'bar'
end
end

''.instance_variables # => []

我开始认为这实际上是不可能的。

最佳答案

可能的。

class Object
class << self
Kernel.send :define_method, :foo do #Object.send to be more restrictive
@foo = 'bar'
end
end
end

.

irb(main):023:0> class Object
irb(main):024:1> class << self
irb(main):025:2> Kernel.send :define_method, :foo do
irb(main):026:3* @foo = 'bar'
irb(main):027:3> end
irb(main):028:2> end
irb(main):029:1> end
=> #<Proc:0x00007f5ac89db168@(irb):25>
irb(main):030:0> x = Object.new
=> #<Object:0x7f5ac89d6348>
irb(main):031:0> x.foo
=> "bar"
irb(main):032:0> [].foo
=> "bar"
irb(main):033:0> //.foo
=> "bar"

理解特征类很重要。每个类都由 Ruby 解释器神秘地实现为隐藏类类型:

irb(main):001:0> class Object
irb(main):002:1> def eigenclass
irb(main):003:2> class << self; self; end
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> x = Object.new
=> #<Object:0x7fb6f285cd10>
irb(main):007:0> x.eigenclass
=> #<Class:#<Object:0x7fb6f285cd10>>
irb(main):008:0> Object.eigenclass
=> #<Class:Object>
irb(main):009:0> Object.class
=> Class

因此,在您的示例中,当您尝试对对象调用 foo 时,它在类 #<Object:0x7fb6f285cd10> 上运行.但是,您希望它操作的是 secret 类 #<Class:#<Object:0x7fb6f285cd10>>

希望对您有所帮助!

关于ruby - 在 Ruby 中,如何在从文字创建的核心类的新对象中初始化实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/914814/

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