2017-06-08 1 views
0

Je suis assez nouveau à Elixir, et en essayant de donner une nouvelle liste de structures en utilisant la compréhension de liste, et pour la vie de moi, je ne peux pas sembler avoir raison:Elixir Liste de comprendre pour créer une nouvelle liste de structures

holdings = ServiceX.update_holdings(
     fn() -> for n <- 1..3, do: n end, 
     &(for n <- 1..100, do: %Holding { 
            client_id: &1, 
            company_id: n, 
            company: "---", 
            revenue: 0.0 } 
     )) 

update_holdings prend dans une autre fonction qui retourne une liste de de struct. L'implémentation réelle appelle la base de données. Ce code est pour un test ExUnit, où j'essaie de retourner des données stubbed.

Semble que je reçois quelque chose d'évident ici. Voici l'erreur que je reçois quand je lance: mix test

** (Protocol.UndefinedError) protocol Enumerable not implemented for 
    %Holding{client_id: 1, company: "---", company_id: 1, revenue: 0.0} 

Alors suis-je manque un module import, ou sinon comment puis-je produire une liste de struct en utilisant la compréhension de la liste?

+3

Pouvez-vous poster le code réel? '& 1' n'est pas une syntaxe valide si c'est le code complet et que vous devriez recevoir une erreur à ce sujet. – Dogbert

+0

@Dogbert élaboré comme demandé. Je vous remercie. –

+1

Je ne vois pas de problème avec le code que vous avez publié. Je soupçonne que les problèmes viennent de la façon dont vous traitez les résultats de l'amusement. Vous devriez publier l'implémentation 'ServiceX.update_holdings'. –

Répondre

0

Code incorrect:

def update_holdings(f1, f2) do 
    ids = f1.() 
    for id <- ids, 
     holdings <- f2.(id), 
     holding <- holdings, 
     do: holding 
end 

Le problème est l'énumération supplémentaire imbriqué holding <- holdings. C'est une erreur d'amateur parce que j'ai mal compris comment cela fonctionne dans Elixir. Modification du dessus fixe le problème suivant:

def update_holdings(f1, f2) do 
    ids = f1.() 
    for id <- ids, 
     holding <- f2.(id), 
     do: holding 
end 
+0

@StevePallen vous aviez tout à fait raison. J'ai fait l'erreur noob dans la méthode update_holdings. Merci de m'avoir indiqué la bonne direction. –