将动态类型传递到管道容器
Pass dynamic types into pipeline container
我想创建一个分片,帮助将工作人员组织成管道来逐步处理数据。我取得了一些成果,但在我看来,有可能让它变得更容易、更方便。在当前的解决方案中,我不喜欢需要指定每个 Worker 的类型,即使 Worker 包装在另一个 class (online example):
class Worker
def do_it(data : String)
puts "#{data} from #{self.class}"
end
end
class Worker1 < Worker; end
class Worker2 < Worker; end
class Worker3 < Worker; end
class Wrapper(T)
property item : T
def initialize(@item : T); end
def worker
@item
end
end
class Pipeline(T)
@stack = [] of T
def self.build
with self.new yield
end
def add(wrapper : T)
@stack << wrapper
end
def run(data : String)
@stack.each do |wrapper|
wrapper.worker.do_it(data)
end
end
end
alias WrapperObject = Wrapper(Worker1) | Wrapper(Worker2) | Wrapper(Worker3)
Pipeline(WrapperObject).build do
add Wrapper(Worker1).new(Worker1.new)
add Wrapper(Worker2).new(Worker2.new)
add Wrapper(Worker3).new(Worker3.new)
run("Some string data")
end
我试图用从块中提取类型并将其传递给管道常量的宏来解决这个问题 class 然后我可以将类型用于内部方法:
macro collect_types(workers)
{% worker_types = workers.map{|k| k.id }.join(" | ") %}
alias worker_types = {{ worker_types }}
STACK = [] of {{ worker_types }}
end
但失去了继承 Pipeline 的可能性......根据我的梦想,分片应该这样使用:
require 'pipeline'
class Worker < Pipeline::Worker
def process(data : String)
# some business logic
end
end
pipeline = Pipeline::Line.build do
add Worker1
add Worker2
add Worker3
end
result = pipeline.run(data)
有可能吗?
问题已在 carc.in
上通过 Command pattern for Crystal by @veelenga. Example 解决
我想创建一个分片,帮助将工作人员组织成管道来逐步处理数据。我取得了一些成果,但在我看来,有可能让它变得更容易、更方便。在当前的解决方案中,我不喜欢需要指定每个 Worker 的类型,即使 Worker 包装在另一个 class (online example):
class Worker
def do_it(data : String)
puts "#{data} from #{self.class}"
end
end
class Worker1 < Worker; end
class Worker2 < Worker; end
class Worker3 < Worker; end
class Wrapper(T)
property item : T
def initialize(@item : T); end
def worker
@item
end
end
class Pipeline(T)
@stack = [] of T
def self.build
with self.new yield
end
def add(wrapper : T)
@stack << wrapper
end
def run(data : String)
@stack.each do |wrapper|
wrapper.worker.do_it(data)
end
end
end
alias WrapperObject = Wrapper(Worker1) | Wrapper(Worker2) | Wrapper(Worker3)
Pipeline(WrapperObject).build do
add Wrapper(Worker1).new(Worker1.new)
add Wrapper(Worker2).new(Worker2.new)
add Wrapper(Worker3).new(Worker3.new)
run("Some string data")
end
我试图用从块中提取类型并将其传递给管道常量的宏来解决这个问题 class 然后我可以将类型用于内部方法:
macro collect_types(workers)
{% worker_types = workers.map{|k| k.id }.join(" | ") %}
alias worker_types = {{ worker_types }}
STACK = [] of {{ worker_types }}
end
但失去了继承 Pipeline 的可能性......根据我的梦想,分片应该这样使用:
require 'pipeline'
class Worker < Pipeline::Worker
def process(data : String)
# some business logic
end
end
pipeline = Pipeline::Line.build do
add Worker1
add Worker2
add Worker3
end
result = pipeline.run(data)
有可能吗?
问题已在 carc.in
上通过 Command pattern for Crystal by @veelenga. Example 解决