2017-10-16 183 views
0

尝试调用库存对象上的closePrice方法时,没有任何内容正在打印出来。但是,当前评论的代码有效。我如何迭代StockList数组并调用我的Stock对象的closePrice方法?调用数组中对象的方法

class Stock 
    attr_reader :date, :open, :high, :low, :close, :adjClose, :volume 
    def initialize(date, open, high, low, close, adjClose, volume) 
     @date = date 
     @open = open 
     @high = high 
     @low = low 
     @close = close 
     @adjClose = adjClose 
     @volume = volume 
    end 

    def closePrice 
     "Close price: #{@close}" 
    end 
end 

class StockList < Array 

    def initialize() 
     @stockList = [] 
    end 

    def addStock(stock) 
     @stockList.push(stock) 
    end 

end 

stocks = Array.new 
stockList = StockList.new() 


CSV.foreach(fileName) do |stock| 
    entry = Stock.new(stock[0], stock[1], stock[2], stock[3], stock[4], stock[5], stock[6]) 
    stocks.push(entry) 

    stockList.addStock(entry) 
end 

# stocks.each do |stock| 
#  puts stock.closePrice 
# end 

stockList.each do |stock| 
    puts stock.closePrice 
end 

难道是缺少链接吗?只从Ruby开始。谢谢。

+1

此代码应该工作。有一点需要注意的是,Ruby强烈建议您将变量和方法名称都命名为“close_price”。大写保留给常量和类/模块名称。另外,'new'方法需要一些荒谬的参数。你应该引导一个包含所有相关值的散列。 – tadman

回答

2

所以问题出在您的StockList的执行。您已经扩展了类数组,但正在设置新的实例变量@stockList。当您致电addStock时,您正在为@stockList变量添加一个实例。但是,如果在StockList实例上调用each,则不会迭代StockList

可以想象,你可以一个方法each添加到StockList,如:

def each(&block) @stockList.each(&block) end

,它应该工作。

但是真的,我会建议重新考虑你的数据结构。 StockList应该不会延伸Array

+0

感谢Rob,对于我应该如何构建数据有什么建议?这背后的想法是有一个我可以添加方法的股票“List”。 – forgetaboutme

+1

扩展Array per-se没有任何问题,但在这种情况下,它不会添加任何功能,所以它是毫无意义的。 '股票'阵列和这个StockList的东西之间的区别基本上是零。 – tadman

+1

我认为有'StockList'对象没问题。我只是不会扩展Array。它只会依赖'@ stockList'内部变量来维护数据。然后你会添加适当的方法并适当使用。如果你真的需要很多迭代类型的方法(并且我想知道你是否真的做了),你可以暴露'@ stockList'变量(例如attr_reader:stockList),或者如果你希望对象本身的方法实现一个'each'方法,然后['include Enumerable'](https://ruby-doc.org/core-2.4.0/Enumerable.html) –