gpt4 book ai didi

ruby-on-rails - 我遇到的模块问题

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

我试图在一个模块中定义一个静态变量和方法,这些模块将被许多类扩展/使用。以下示例演示:

module Ammunition
def self.included(base)
base.class_eval("@@ammo = [bullets]")
end

def unload
p @@ammo #<-- doesn't work
end
end

class Tank
include Ammunition
@@a += [shells]
end

class Airplane
include Ammunition
@@a += [missiles, photon_torpedoes]
end

Tank.new.unload
Airplane.new.unload

这不起作用,因为出于某种原因,ammunition 不知道如何在类的上下文中评估@@ammo(我最初认为该模块的行为就像一个包含文件)。我必须将“卸载”复制到每个类,这是我现在正在做的,但我想干掉它 b/c 我还有许多其他方法可以添加到模块中。

建议?合理的解决方案是在类而不是模块的上下文中评估“卸载”(但如何在 Ruby 中执行此操作?)

谢谢!

最佳答案

类变量的工作方式可能很奇怪,这种用法表明了这一点。 @@ammo 的范围是什么? Ammunition 或者 Tank 有自己的副本吗?事实证明,@@ammo 受模块作用域限制,包含它的类可以简单地访问它。

module Ammunition
def self.included(base)
base.class_eval do
puts "@@ammo was: #{defined?(@@ammo) ? @@ammo.join(',') : 'nil'}"
@@ammo = ['bullets']
puts "@@ammo is now: #{@@ammo}"
puts '---'
end
end

def unload
@@ammo
end
end

class Tank
include Ammunition
@@ammo += ['shells']
end

class Airplane
include Ammunition
@@ammo += ['missiles', 'photon_torpedoes']
end

puts "Tank unloaded: #{Tank.new.unload.join(', ')}"
puts "Airplane unloaded: #{Airplane.new.unload.join(', ')}"

这会产生:

@@ammo was: nil
@@ammo is now: bullets
---
@@ammo was: bullets,shells
@@ammo is now: bullets
---
Tank unloaded: bullets, missiles, photon_torpedoes
Airplane unloaded: bullets, missiles, photon_torpedoes

Tank 包含该模块时,它将 @@ammo 从 nil 设置为一个包含子弹的数组。当 Airplane 包含模块时,它会覆盖我们刚刚设置的弹药值。


这是你想要做的

module Ammunition
def self.included(base)
base.class_eval do
include Ammunition::InstanceMethods
extend Ammunition::ClassMethods
@ammo = ['bullets']
end
end

module ClassMethods
def ammo
@ammo
end
end

module InstanceMethods
def unload
self.class.ammo.join(',')
end
end
end

class Tank
include Ammunition
@ammo += ['shells']
end

class Airplane
include Ammunition
@ammo += ['missiles', 'photon_torpedoes']
end

puts "Tank unloaded: #{Tank.new.unload}"
puts "Airplane unloaded: #{Airplane.new.unload}"

类可以有实例变量,而且它们的作用域更容易理解。将您的模块分成实例和类方法允许您为两者提供功能。此代码段生成以下输出

Tank unloaded: bullets,shells
Airplane unloaded: bullets,missiles,photon_torpedoes

关于ruby-on-rails - 我遇到的模块问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225854/

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