2013-07-16 31 views
7

println w następujący kod działa (z lub bez toInt)wartość scala toInt nie jest członkiem żadnej

println("retweets : ", e.getOrElse("retweets", 0).toInt) 

top10Tweets(""+e.get("text").get, e.getOrElse("retweets", 0).toInt) 

Ale kiedy przekazać go jako argument funkcji (jak wyżej), to nie działa. Mówi "wartość toInt nie jest członkiem żadnej"

Kiedy usunąć toInt, to mówi,

type mismatch; 
[error] found : Any 
[error] required: Int 

e znajduje się mapa, jak następuje,

def tweetDetails(obj: twitter4j.Status) = { 
    Map(
    "id" -> obj.getUser().getId(), 
    "screenName" -> obj.getUser().getScreenName(), 
    "text" -> obj.getText(), 
    "retweets" -> obj.getRetweetCount(), 
    "mentions" -> obj.getUserMentionEntities().length) 
    } 

podpis top10Tweets,

def top10Tweets(tweets: String, retweet_c: Int, mention_c: Int) = { 
} 
+0

Proszę podać kompletny przykład, zwłaszcza typu 'e'. – Beryllium

Odpowiedz

6

edit:

OK, z nowymi informacjami Proponuję utworzyć klasę spraw, która przechowuje dane zamiast używać Map, w ten sposób zachowasz informacje o typie. Wiem, że często używa się skrótów/map dla języków dynamicznie pisanych, ale w językach statycznie wpisanych, preferowane są typy danych scala.

oryg:

Jak ja nie wiem co e jest, ani co podpis top10Tweets ma, mogę tylko przypuszczać. Ale z twojego kodu i błędu zakładam, że e to Map[String, String] i próbujesz uzyskać ciąg reprezentujący liczbę całkowitą dla klucza "retweets" i przekonwertować go na Int. Domyślną wartością jest Int, więc informacje o typie wejściowym dotyczą typu Any, ponieważ jest to najbardziej popularny typ superpiksela: String i Int. Jednak Any nie ma metody toInt, a zatem pojawi się błąd.

Map("x" -> "2").getOrElse("x", 4).toInt 
<console>:8: error: value toInt is not a member of Any 
       Map("x" -> "2").getOrElse("x", 4).toInt 

Albo przechodzą w wartości domyślnej jako String, lub przekonwertować wartość "retweets" do Int wcześniej, jeśli istnieje:

e.get("retweets").map(_.toInt).getOrElse(0) 

Zresztą trochę więcej informacji pomogłoby dać dokładną odpowiedź .

+0

Dzięki. Próbowałem, e.get ("retweets"). Map (_. ToInt) .getOrElse (0), ale nadal otrzymuję "wartość toInt nie jest członkiem Any" .... Czy to dlatego, że e to Map (String, Any)? Zaktualizowałem pytanie odpowiednim kodem. – user644745

+0

Witaj Drexin, dzięki. Czy mógłbyś podać mi przykład użycia "klasy przypadku" zamiast mapy? – user644745

+0

To dość podstawowe rzeczy, więc proponuję przeczytanie dobrej książki o scali, aby nauczyć się podstaw.Pragramming w Scali autorstwa Martina Odersky'ego (twórcy scala) jest dostępny bezpłatnie w Internecie. – drexin

2

Tak, ponieważ w Mapie jest "ciąg" -> "ciąg" i robiłeś, gdy getOrElse (else) ciąg -> int, to jest dlaczego Any.

Map("x" -> 2).getOrElse("x", 4).toInt 

działa prawidłowo lub można:

Map("x" -> "2").getOrElse("x", "4").toInt 
+0

W pierwszym przykładzie 'toInt' jest zbędne. Zwrócona wartość jest już "Int". –