Итак, я сделал довольно большое приложение в Ruby, но я понял, что он совершенно неорганизован, чтобы иметь все как метод экземпляра в одном огромном классе, поэтому я хочу разбить его на вложенные модули просто так он немного организован. Я искал StackOverflow, но кажется, что на самом деле это не так часто использовать модули, вложенные в класс.Модули Ruby, вложенные в классы
Я пытаюсь понять, как вложенные работают модули, используя простой пример класса:
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
Но я получаю эту ошибку:
...phones.rb:3:in `<class:Phones>': uninitialized constant Phones::Apps (NameError)
Перемещение включают вызовы в нижнюю часть дает ошибку: phones.rb: 38: в '<верха (обязательно)>«: неопределенный метод приложение»для # <Телефонов: 0x007fe9c989c4b0> (NoMethodError) '. Кроме того, если вы используете второй способ, который вы предложили, в каком классе вы объявляете метод initialize и все переменные экземпляра? –
, вы не должны вызывать include в области экземпляра, поскольку, похоже, вы делаете это из своей неопределенной ошибки метода. Я имел в виду, что вы можете переместить вызовы include прямо перед 'end'' class Phones'. Что касается инициализации, вы можете определить это в любом из модулей. Когда вы включаете их, вы получаете все свои методы экземпляра. Поэтому, если вы определили несколько 'initialize', только один из них запустится, если вы не назовете их' super'. –