gpt4 book ai didi

ruby - 在 Ruby 中编写 "Excel-like"影响网络的最佳方法?

转载 作者:太空宇宙 更新时间:2023-11-03 18:00:15 25 4
gpt4 key购买 nike

我有一个节点网络,每个节点都会影响其他一些节点的状态(想象一个 Excel 电子表格,其单元格值通过公式取决于其他单元格)。

我想知道在 Ruby 中实现它的最干净的方法是什么?

当然我可以每个节点一个进程,但如果节点数量增加,它将如何执行?而且,我确定有相应的库,但我找不到最新的库。

感谢您的帮助!

更新:听起来 EventMachine 可以完成这项工作......但它似乎更适合少数“节点”

最佳答案

这听起来像是观察者模式的好情况。这是 ruby​​ 中的一个示例:

require 'observer'

class Node
attr_accessor :id
@@current_node_id = 0
def initialize
@@current_node_id += 1
id = @@current_node_id
end
include Observable

attr_reader :value


protected
def value=(new_value)
return if @value == new_value
old_value = @value
@value = new_value
changed
notify_observers(id, old_value, @value)
end
end


class ValueNode < Node
def initialize(initial_value)
super()
@value = initial_value
end

def value=(new_value)
super(new_value)
end
end


class SumNode < Node
def initialize(*nodes)
super()
@value = nodes.map(&:value).inject(0, &:+)
nodes.each do |node|
node.add_observer(self)
end
end


def update(id, old_value, new_value)
self.value = self.value - old_value + new_value
end
end


def test
v1 = ValueNode.new 4
v2 = ValueNode.new 8
sum = SumNode.new(v1, v2)
sum2 = SumNode.new(v1, sum)
v2.value = 10
p sum.value
p sum2.value
end


test()

请注意 SumNode 的值不会在每次请求时都重新计算 - 而是在其值节点之一更新时更新。这递归地工作,因此内部 SumNodes 也会触发更新。由于通知包含节点的唯一 id,因此可以编写更复杂的 Node 类型,例如包含公式的类型。

参见 http://www.ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html有关 Observable 的更多详细信息

关于ruby - 在 Ruby 中编写 "Excel-like"影响网络的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6517752/

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