所以我在Ruby中创建了一个相当大的应用程序,但是我已经意识到将一切都作为一个实例方法放在一个巨大的类中是非常无组织的,所以我想把它拆分成嵌套模块,这样就有点了更有条理。我在StackOverflow上搜索过,但似乎使用嵌套在类中的模块实际上并不常见。
我试图通过使用更简单的示例类来理解嵌套模块的工作原理:
Jan 22 2017 12: +0
然后我想跑:
class Phones
include Apps
include Call
attr_accessor :brand, :model, :price, :smartphone
def initialize(brand,model,price,smartphone=true)
@price = price
@brand = brand
@model = model
@smartphone = smartphone
@task = 'stand-by'
end
module Apps
public def camera
@task = __method__.to_s
puts "Took a picture!"
self
end
public def gallery
@task = __method__.to_s
puts "Photos!"
self
end
end
module Call
public def scall
@task = __method__.to_s
puts "Ring ring!"
self
end
end
end
但我一直收到这个错误:
s7 = Phones.new('Samsung','S7 Edge',3000).Apps.camera
答案 0 :(得分:0)
问题是您的include
调用是在实际模块定义之前。
当你编写一个类定义时,除了方法定义之类的东西之外,其中的所有内容都会立即执行。例如:
class Foo
puts 1 + 1
end
将立即打印2 ,它不会等到你说Foo.new
。
解决这个问题的一种方法是将include
调用移到类定义的末尾,或将模块移到顶层。您还可以分离嵌套模块:
class Phones
module Apps
# your stuff here
end
end
class Phones
module Call
# stuff
end
end
# just make sure the previous modules have been defined
# by the time this code is run
class Phones
include Call
include Apps
end