嵌套在类中的Ruby模块

时间:2017-01-22 19:30:24

标签: ruby class module nested

所以我在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

1 个答案:

答案 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