在Ruby中向数组添加对象时出现的问题

在Ruby中向数组添加对象时出现的问题,ruby,arrays,object,Ruby,Arrays,Object,所以我对Ruby有一个奇怪的问题。我创建了一个名为Path的类,它有start\u节点和end\u节点。然后我创建了一个名为Path的空数组,并添加了Path对象。当我放置路径时,它会打印开始节点和结束节点的列表。但是当我试图打印每个路径时,它只打印出地址(看起来像),而不是开始和结束节点。我不允许访问路径中每个路径的开始节点和结束节点。以下是我的代码的基本结构: path = Path.new(start_node, end_node) paths.push(path) ... puts p

所以我对Ruby有一个奇怪的问题。我创建了一个名为
Path
的类,它有
start\u节点
end\u节点
。然后我创建了一个名为
Path
的空数组,并添加了
Path
对象。当我放置路径时,它会打印开始节点和结束节点的列表。但是当我试图打印每个
路径时,它只打印出地址(看起来像),而不是开始和结束节点。我不允许访问路径中每个路径的
开始节点
结束节点
。以下是我的代码的基本结构:

path = Path.new(start_node, end_node)
paths.push(path) 
...
puts paths.to_s # prints list of paths and each path consists of start_node and end_node
# below lines of code prints the addresses
paths.each do |path|
    puts path.to_s
end
我们可以在Ruby中创建对象并将其添加到数组中吗?如果是这样,我在这里做错了什么。提前谢谢你的帮助

以下是整个脚本:

class Path
    def initialize (start_node, end_node, color, type)
        @start_node = start_node #start node of path
        @end_node = end_node #end node of path
        @color = color#path color (Red, Blue, Green)
        @type = type # path type (Horse, Cable, Trolley, Bus)
    end
    def start_node
        @start_node
    end
    def end_node
        @end_node
    end
    def color
        @color
    end
    def type
        @type
    end
end

class Graph
    def initialize
        @paths = []
        @num_of_nodes
        @num_of_edges
    end
    def read_file(filename)
        File.foreach(filename).with_index do |line, line_num|
            array = []
            array = line.split
            if line_num == 0
                @num_of_nodes = array[0]
                @num_of_edges = array[1]
                puts @num_of_edges + " " + @num_of_nodes
            else
                start_node = array[0]
                end_node = array[1]
                color = array[2]
                type = array[3]
                path = Path.new(start_node, end_node, color, type)
                @paths << path
            end
        end
    end
    def paths
        @paths
    end 
    def print_paths
        @paths.each do |path|
            puts path.start_node.to_s
        end
    end
end

graph = Graph.new
graph.read_file("./grandpaTransitInput.txt")
graph.paths.each do |path|
    puts path.to_s
end
类路径
def初始化(开始节点、结束节点、颜色、类型)
@开始节点=开始节点#路径的开始节点
@end_节点=end_节点#路径的end节点
@颜色=颜色#路径颜色(红色、蓝色、绿色)
@类型=类型#路径类型(马、电缆、电车、公共汽车)
结束
def start_节点
@启动节点
结束
def end_节点
@结束节点
结束
def颜色
@颜色
结束
def类型
@类型
结束
结束
类图
def初始化
@路径=[]
@节点数
@边数
结束
def read_文件(文件名)
File.foreach(filename).with_index do | line,line _num|
数组=[]
array=line.split
如果行_num==0
@节点数=数组[0]
@边数=数组[1]
将\u边的@num\u+“”+@num\u节点
其他的
开始节点=数组[0]
end_节点=数组[1]
颜色=数组[2]
类型=数组[3]
path=path.new(开始节点、结束节点、颜色、类型)

@这对我来说很好。看看你的体验有何不同:

2.2.1 :014 > class Path
2.2.1 :015?>   attr_accessor :start_node, :end_node
2.2.1 :016?>   def initialize(s, e)
2.2.1 :017?>     @start_node = s
2.2.1 :018?>     @end_node = e
2.2.1 :019?>   end
2.2.1 :020?> end
 => :initialize 
2.2.1 :021 > p = Path.new(1, 2)
 => #<Path:0x007fd6fa058d80 @start_node=1, @end_node=2> 
2.2.1 :024 > paths = []
 => [] 
2.2.1 :025 > paths.push p
 => [#<Path:0x007fd6fa058d80 @start_node=1, @end_node=2>] 
2.2.1 :026 > paths.push p
 => [#<Path:0x007fd6fa058d80 @start_node=1, @end_node=2>, #<Path:0x007fd6fa058d80 @start_node=1, @end_node=2>] 
2.2.1 :029 > puts paths.to_s
[#<Path:0x007fd6fa058d80 @start_node=1, @end_node=2>, #<Path:0x007fd6fa058d80 @start_node=1, @end_node=2>]
=> nil 
2.2.1:014>类路径
2.2.1:015?>属性访问器:开始节点,:结束节点
2.2.1:016?>def初始化(s、e)
2.2.1:017?>@start_node=s
2.2.1:018?>@end_node=e
2.2.1:019?>结束
2.2.1:020?>结束
=>:初始化
2.2.1:021>p=Path.new(1,2)
=> # 
2.2.1:024>路径=[]
=> [] 
2.2.1:025>路径推送p
=> [#] 
2.2.1:026>path.push p
=> [#, #] 
2.2.1:029>将路径放置到
[#, #]
=>零

方法
put
将在给定对象的内部调用
。您的类“Path”没有定义如何将其转换为字符串。Ruby将使用默认方法,只打印一些地址

但是您可以添加自己的方法来进行对话,并且
put path
将使用它

class Path
  ..
  def to_s
    "#{@type} path from #{@start_node} to #{@end_node} in #{@color}"
  end
end

数组是一种特殊情况,通常应使用
join
打印它。如果直接打印,ruby将对所有元素调用
inspect
。这是为了帮助调试。这就是为什么在数组上调用时会看到内部,而在单个对象上调用时不会看到内部。

看起来不错。。可能发布模型代码。您正在尝试检查对象。写入
p路径。to\u s
p路径。to\u s
仍会打印带有引号的地址。然后,当您执行
将p.to\u s
时,它会打印出地址而不是开始和结束节点。当我试图分别访问
start\u node
end\u node
时,它表示
p
是一个nil对象。我知道为什么。。。您是否尝试打印出您的路径对象?NVM。我的代码有效。我可以访问开始节点和结束节点。我不知道为什么我认为没有。但我仍然不明白为什么path.to_会打印地址。谢谢。@JinOh不知道你在说什么。Ruby总是以相同的格式打印对象:
#
是。我必须重写to_的方法。我应该在问之前想到这一点。谢谢你的帮助!