2017-10-16 6 views
0

Lorsque vous essayez d'appeler la méthode closePrice sur l'objet stock, rien n'est imprimé. Cependant, le code actuellement commenté fonctionne. Comment puis-je parcourir le tableau StockList et appeler la méthode closePrice de mes objets Stock?Méthode d'appel d'un objet dans un tableau

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 

Pourrait-il y avoir des liens manquants? Seulement en commençant par Ruby. Merci.

+1

Ce code devrait fonctionner. Une chose à noter est que Ruby vous encourage fortement à nommer les variables et les noms de méthodes en minuscules comme 'close_price'. Les majuscules sont réservées aux constantes et aux noms de classe/module. De plus, cette méthode 'new' prend un nombre absurde d'arguments. Vous devriez vous diriger vers un hachage qui a toutes les valeurs associées. – tadman

Répondre

2

Donc le problème est dans votre implémentation de StockList. Vous avez étendu le tableau de classes mais configurez une nouvelle variable d'instance @stockList. Lorsque vous appelez addStock, vous ajoutez une instance à la variable @stockList. Mais lorsque vous appelez each sur l'instance StockList, il ne s'agit pas d'itérer sur StockList.

On peut imaginer, vous pouvez ajouter une méthode each à StockList comme:

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

et cela devrait fonctionner. Mais je recommande vraiment de repenser vos structures de données. StockList ne devrait vraiment pas étendre Array.

+0

Merci Rob, des suggestions pour structurer mes données? L'idée derrière cela était d'avoir un '' '' List''' de stocks que je pourrais ajouter des méthodes. – forgetaboutme

+1

Il n'y a rien de mal à étendre le tableau en soi, mais dans ce cas, il n'ajoute aucune fonctionnalité, donc c'est inutile. La différence entre le tableau 'stocks' et cette chose StockList est fondamentalement zéro. – tadman

+1

Je pense avoir un objet 'StockList' est bien. Je ne voudrais pas étendre Array. Il s'appuierait simplement sur la variable interne '@ stockList' pour maintenir les données. Et puis vous ajouteriez les méthodes appropriées et l'utilisation appropriée. Si vous avez vraiment besoin de beaucoup de méthodes de type itération (et je me demande si vous le faites vraiment), vous pouvez exposer la variable '@ stockList' (par exemple attr_reader: stockList) ou si vous voulez que les méthodes sur l'objet implémentent un Méthode 'each', puis [' include Enumerable'] (https://ruby-doc.org/core-2.4.0/Enumerable.html) –