问题在ruby中支持双向语法

Man*_*Das 9 ruby rubygems ruby-on-rails

我有一种情况需要调用这样的东西:

class Office

  attr_accessor :workers, :id

  def initialize
    @workers = []
  end

  def workers worker
    type = worker.type
    resp = Worker.post("/office/#{@id}/workers.json", :worker => {:type => type})
    worker = Worker.new()
    resp.to_hash.each_pair do |k,v|
      worker.send("#{k}=",v) if worker.respond_to?(k)
    end
    self.workers << worker
  end

end
Run Code Online (Sandbox Code Playgroud)

工人阶级

class Worker
  attr_accessor :office_id, :type, :id

  def initialize(options={})
    @office_id = options[:office].nil? ? nil : options[:office].id
    @type = options[:type].nil? ? nil : options[:type].camelize
    if !@office_id.nil?
       resp = self.class.post("/office/#{@office_id}/workers.json", :worker => {:type => @type})
       @id = resp.id
       office = options[:office]
       office.workers = self
    end
  end

  def <<(worker)
    if worker
      type = worker.type
      resp = Worker.post("/office/#{office_id}/workers.json", :worker => {:type => type})
      debugger
      @id = resp.id
      resp.to_hash.each_pair do |k,v|
        self.send("#{k}=",v) if self.respond_to?(k)
      end
      debugger
      return self
    end
  end
Run Code Online (Sandbox Code Playgroud)

我可以做这样的事情

office = Office.new()
new_worker = Worker.new()
office.workers new_worker
Run Code Online (Sandbox Code Playgroud)

但我需要做同样的事情,如上所述.在此之前,我需要更改Office的初始化方法以启动def <<(worker)工作器实例的方法.

class Office
  ...
  def initialize
    @workers = Worker.new
    @workers.office_id = self.id
  end


office = Office.new()
new_worker = Worker.new()
office.workers << new_worker
Run Code Online (Sandbox Code Playgroud)

现在问题是,后面的实现创建了2个工人实例?

Jim*_*lle 0

我不是 100% 确定为什么您在这里没有收到错误,但由于 Office#workers 最后一行是 self.workers <<worker,因此您正在添加在 Office#workers 中创建的新工作人员(在第 3 行创建)方法),然后返回工人对象,然后使用在方法外部创建的新工人再次调用 #<<

  • 是的,这就是为什么它为了实现这一点而搞砸了......所以当我调用“office.workers &lt;&lt; new_worker”时,我知道如何实现 #&lt;&lt; 方法,就像我在“office.workers new_worker”中所做的那样 (2认同)
  • 我只希望后一种方法具有与前一种方法相同的功能并且具有相同的名称。当我调用`office.workers &lt;&lt; new_worker`时,它只是调用workers属性的默认getter/setter。 (2认同)