gpt4 book ai didi

ruby-on-rails - 在 ruby​​ 中支持两种语法的问题

转载 作者:数据小太阳 更新时间:2023-10-29 06:50:56 25 4
gpt4 key购买 nike

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

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

worker 类(Class)

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

我可以很好地完成这样的事情

office = Office.new()
new_worker = Worker.new()
office.workers new_worker

但我需要像下面那样做我上面所做的同样的事情。在此之前,我需要更改 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

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

最佳答案

我不是很确定,但我想你会喜欢这个:

class Office

attr_accessor :workers, :id

def initialize
@workers = []
end

alias_method :workers, :return_worker_array

def workers worker
unless worker
return_worker_array
else
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)
return_worker_array << worker
end
end

结束

这样你就可以去掉Worker#<<完全,你也应该删除行

office.workers = self

Worker#initializeoffice.workers应该是一个数组。来回更改属性的类型(duck-typing 就可以)不是一个好主意,因为您很可能会忘记当前状态,迟早会遇到错误。

为了遵循“关注点分离”,我建议对 workers 进行整个管理仅在 Office ,否则它会很快变得太困惑,从长远来看将更难维护。

关于ruby-on-rails - 在 ruby​​ 中支持两种语法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6248266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com