Нечто подобное может сработать, так что вы можете декларативно определять «компоненты» (или что бы то ни было). Это излишне для такого рода примера, но вы можете использовать его, когда вам нужно определить десятки / сотни этих вещей, или вы помещаете это как часть какой-то структуры (как это делает rails).
component
метод уровня класса обычно находится в каком-то другом модуле, который включается в класс, а не объявляет его встроенным, где он используется следующим образом.
class Device
class << self
def component(component_name)
define_method(component_name) do
mode = @data_resource.send("get_#{component_name}_mode", @id)
presets = @data_resource.send("get_#{component_name}_presets", @id)
summary = "#{component_name} : #{mode} ($#{presets})"
presets == "XTC909" ? "* #{summary}" : summary
end
end
end
component :display_device
component :chip
component :input_device
def initialize(device_id, data_resource)
@id = device_id
@data_resource = data_resource
end
end
Вы можете использовать его с чем-то вроде:
class DataResource
def method_missing(method, *args)
# puts "called #{method} with:#{args.inspect}"
"#{method}-#{args.join(':')}"
end
end
device = Device.new("ID123", DataResource.new)
puts device.display_device
puts device.chip
puts device.input_device