【发布时间】:2013-12-14 11:15:20
【问题描述】:
我可能犯了一个重大的设计错误,但这是我第一次在 Ruby 中使用 Structs。
As detailed in this question,我有三个对象,Vertex、Edge 和 Graph。 Vertex 有简单的属性(标量),但 Edge 可以有 :endpoints,它是数组中的一对顶点。具体来说,Edge 有一个标量 :weight 和一个顶点数组 :endpoints。最后,Graph 存储了:vertexes 和:edges,它们是顶点和边的数组。
Edge = Struct.new(:weight, :endpoints)
由于 Graph 是一个包含结构体的结构体,我创建了一个方法来从 Graph 中获取标量 weights:
Graph = Struct.new(:vertexes, :edges) do
def get_weights()
w = []
self.edges.each do |ed| w << ed.weight end
end
#truncated
end
但是,如果我运行它,我会得到边,而不是标量整数:
[226] pry(main)> t_weights = [4,8,8,11,7,4,2,9,14,10,2,1,6,7]
=> [4, 8, 8, 11, 7, 4, 2, 9, 14, 10, 2, 1, 6, 7]
[227] pry(main)> t_edges.each_with_index.map do |ed,ind|
[227] pry(main)* ed.weight = t_weights[ind]
[227] pry(main)* ed.endpoints = endpoints[ind]
[227] pry(main)* # p ed.weight
[227] pry(main)* end
t_grap = Graph.new(t_verts, t_edges)
=> #<struct Graph
vertexes=
[#<struct Vertex parent=nil, rank=nil, id=0.31572617312378737>,
#<struct Vertex parent=nil, rank=nil, id=0.24063512558288636>,
#<struct Vertex parent=nil, rank=nil, id=0.34820800389791284>,
#<struct Vertex parent=nil, rank=nil, id=0.86247407897408>,
#<struct Vertex parent=nil, rank=nil, id=0.4503814825928186>,
#<struct Vertex parent=nil, rank=nil, id=0.4020451841058619>,
#<struct Vertex parent=nil, rank=nil, id=0.09096934472128582>,
#<struct Vertex parent=nil, rank=nil, id=0.9942198795853134>,
#<struct Vertex parent=nil, rank=nil, id=0.4393226273344629>], <truncated>
edges=
[#<struct Edge
weight=4,
endpoints=
[#<struct Vertex
parent=#<struct Vertex:...>,
rank=0, <truncated>
[230] pry(main)> t_grap.get_weights
=> [#<struct Edge
weight=4,
endpoints=
[#<struct Vertex
parent=#<struct Vertex:...>,
rank=0,
id=0.6540666040368713>,
#<struct Vertex
parent=#<struct Vertex:...>,
rank=0,
id=0.7511069577638254>]>,
#<struct Edge
weight=8,
endpoints=
[#<struct Vertex
parent=#<struct Vertex:...>,
rank=0,
id=0.6540666040368713>,<truncated>
我尝试将 attr_accessor :weights 添加到 Edge,但是上面设置初始值的代码 sn-p 会静默失败,使每个 Edge.weight 等于 nil。
我做错了什么?
【问题讨论】: