Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby,DI在另一个类循环中_Ruby_Loops_Oop_Dependency Injection - Fatal编程技术网

Ruby,DI在另一个类循环中

Ruby,DI在另一个类循环中,ruby,loops,oop,dependency-injection,Ruby,Loops,Oop,Dependency Injection,当我试图在代码中注入依赖项时遇到了一些障碍,目标是将对象传递给函数,注入依赖项。我用procs尝试过,但是没有任何意义,因为procparser=proc.new{parser.new}调用了一个新对象,但是在初始化后传递的参数中,我没有尝试lambdas,并且觉得自己完全找不到不违反Ruby风格的方法。请帮帮我 代码如下: class Interface attr_reader :data, :parser def initialize(data = [1, 2, 3], parse

当我试图在代码中注入依赖项时遇到了一些障碍,目标是将对象传递给函数,注入依赖项。我用procs尝试过,但是没有任何意义,因为proc
parser=proc.new{parser.new}
调用了一个新对象,但是在初始化后传递的参数中,我没有尝试lambdas,并且觉得自己完全找不到不违反Ruby风格的方法。请帮帮我

代码如下:

class Interface
  attr_reader :data, :parser

  def initialize(data = [1, 2, 3], parser = Parser.new)
    @data = data
    @parser = parser
  end

  def parse_fresh_reports
    data.each do |datum|
      parser.new(datum).run
    end
  end
end

class Parser
  attr_accessor :datum
  
  def initialize(datum)
    @datum = datum 
  end 
 
  def parse_report
    puts "from #{self.inspect} #{datum}"
  end
end

Interface.new.parse_fresh_reports
我想要这样的东西

class Interface
  attr_accessor :data, :parser

  def initialize(data = [1, 2, 3], parser = Parser)
    @data = data
    @parser = parser
  end

  def parse_fresh_reports
    data.each do |datum|
      parser.run(datum)
    end
  end
end

class Parser
  attr_accessor :datum
  
  def self.run(datum)
    set_params(datum)
    parse_report
  end

  def set_params(datum)
    @datum = datum
  end

  def parse_report
    puts "from #{self.inspect} #{datum}"
  end
end

Interface.new.parse_fresh_reports



我不知道是否可以将const作为参数传递。

parser=parser.new
不起作用,因为
parser.new
需要参数

您可以传入一个常量,它将传入该常量的内容。在本例中,是解析器类。这是一个好主意。但是如何编写解析器类将类方法(如
self.run
)与实例方法(如
set_params
)混合在一起。为了使它工作,您必须使所有内容都成为类方法

class Parser
  # Everything inside the following block affects the class Parser.
  # Not instances of Parser.
  class << self
    attr_accessor :datum
    
    def run(datum)
      set_params(datum)
      parse_report
    end

    def set_params(datum)
      @datum = datum
    end

    def parse_report
      puts "from #{self.inspect} #{datum}"
    end
  end
end
这允许传入其他解析器

class MyParser < Parser
  def run(*)
    super
    puts "Me, too!"
  end
end

Interface.new([1, 2, 3], MyParser.new).parse_fresh_reports
classmyparser
class MyParser < Parser
  def run(*)
    super
    puts "Me, too!"
  end
end

Interface.new([1, 2, 3], MyParser.new).parse_fresh_reports