gpt4 book ai didi

ruby - 自定义 << 方法

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

class Foo
def initialize
@bar = []
end

def changed_callback
puts "Bar has been changed!"
end

def bar
@bar
end

def bar=(a)
@bar = a
self.changed_callback() # (hence why this doesn't just use attr_accessor)
end

def bar<<(a)
@bar.push(a)
self.changed_callback()
end
end

f = Foo.new()
f.bar = [1,2,3]
=> "Bar has been changed!"
f.bar << 4
=> "Bar has been changed!"
puts f.bar.inspect
=> [1,2,3,4]

这样的事情有可能吗?

谢谢!

最佳答案

您需要以某种方式扩展 Foo#bar 返回的对象与适当的 #<<方法。也许是这样的?

class Foo
module ArrayProxy
def <<(other)
@__foo__.changed_callback
super
end
end

def initialize
@bar = []
end

def changed_callback
puts 'Bar has been changed!'
end

def bar
return @bar if @bar.is_a?(ArrayProxy)
@bar.tap {|bar| bar.extend(ArrayProxy).instance_variable_set(:@__foo__, self) }
end

def bar=(a)
@bar = a
changed_callback # (hence why this doesn't just use attr_accessor)
end

end

f = Foo.new
f.bar = [1,2,3]
# "Bar has been changed!"
f.bar << 4
# "Bar has been changed!"
puts f.bar.inspect
# => [1,2,3,4]

关于ruby - 自定义 << 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384285/

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