2012-09-28 11 views
7

Mam metodę w Scali, która zwraca krotkę, powiedzmy, że metoda nazywa się "test". Następnie chcę zrobićJak dopasować wzór do zmiennej wielkiej litery?

val (X,Y) = test() 

Jednak wzorzec dopasowywania działa tylko w Scala, gdy nazwy zmiennych są małe, to znaczy:

val(_X,_Y) = test(); val X = _X; val Y = _Y 

... działa ok, ale jest brzydki i nie lakoniczny. Ponieważ X i Y są macierzami, tak naprawdę nie chcę używać zmiennych pisanych małymi literami. (W scipy i matlab nie miałbym na przykład takiego ograniczenia).

Myślę, że jest jakiś sposób, aby się upewnić, że małe litery zachowują się jak wielkie litery, tj. Robiąc `x`. Być może jest jakiś sposób na zachowanie wielkich zmiennych zachowując się jak małe litery? Tak, to jest moje pytanie: czy istnieje jakiś sposób dopasowywania wzorca bezpośrednio do zmiennych wielkich liter w Scali?

Odpowiedz

6

Krótka odpowiedź to nie.

Konwencje składni sprawiają, że kod jest czytelny i zrozumiały dla innych. Konwencja Scala polega na tym, że zmienne zaczynają się od małych liter i stałych, a klasy zaczynają od wielkich liter. Naruszając to, nie tylko otrzymujesz problemy, takie jak problemy z dopasowaniem wzorców, Twój kod staje się mniej czytelny. (Uwierz mi, jeśli będziesz musiał przeczytać kod napisany przez kogoś, kto nie dba o takie konwencje, przeklniesz tę osobę.)

Jeśli chcesz podkreślić, że zmienne są macierzami, proponuję możesz użyć xMatrix i yMatrix lub coś w tym stylu. Ujawni to, że są to zmienne i że reprezentują macierze.

Możesz też utworzyć konwencję specyficzną dla swojego projektu, aby wszystkie zmienne macierzowe zakończyły się na, powiedzmy "M", na przykład xM i yM.

Warto wpisać jeszcze kilka znaków, aby kod był czytelny.

+4

Wydaje mi się, że jest coś dziwnego w języku, który pozwala używać dużych nazw zmiennych przez pierwsze 20 godzin od odkrycia języka, a potem nagle, dla jednego małego, ale przydatnego użycia, nagle decyduje, że zmienne typu "nie" , nie dozwolony! –

+0

@HughPerkins Zgadzam się na to. I staje się jeszcze bardziej nieprzyjemny: Scala pozwala na dopasowywanie do wzorca stałych, które są zdefiniowane jako zmienne z dużymi nazwami.Coś jak "val MyConst =" Text "; someString match {case MyConst => ...; ...} '. To powoduje wiele zamieszania. Najrozsądniejszą zasadą jest używanie wielkich liter tylko dla stałych najwyższego poziomu i używanie małych liter we wszystkich innych miejscach. –

+0

OK, cóż, nikt nie dostarczył pozytywnej odpowiedzi na to pytanie, więc zaznaczę twoją odpowiedź jako odpowiedź na teraz, szczególnie gdy podałeś kilka konstruktywnych pomysłów, jak obejść brak możliwości określenia typu (stała vs zmienna) zmiennej w Scali. –

1

Nie ma sposobu, aby to zrobić i nie powinno być. Masz już typ zmiennej, aby powiedzieć, że jest to macierz, więc nie ma potrzeby wprowadzania wielkich liter nazw zmiennych.

+0

Może to dotyczyć oprogramowania ogólnego przeznaczenia (nie twierdzę, że tak jest, ale nie zamierzam twierdzić, że tak nie jest), ale mam na myśli użycie do uczenia maszynowego, gdzie X oznacza " wszystkie punkty danych ", a x oznacza" pojedynczy punkt danych ". Jest to standardowa notacja, np. Patrz biskup, "Rozpoznawanie wzorów i uczenie maszynowe", str. 141. Oczywiście, można przesunąć sposób, w jaki kody kodują pasujące do języka, ale nie jest to język, który ułatwi nam życie, a nie inne. odwrotnie? scipy i matlab oraz java i C++ all pozwalają na użycie X jako nazwy macierzy. –

+0

oczywiście jest to standardowa notacja z matematyki, tak jak x i xs są standardową notacją w scala. Jednak żadna z tych zmian nie zmienia prostego faktu, że to, co chcesz zrobić, nie zadziała. –

+0

Naprawdę chciałbym argumentować, że zmienna powinna mieć typ, aby poinformować kompilator/środowisko wykonawcze, czy jest to stała czy zmienna. Nie jestem pewien, czy używanie wielkich/małych liter do rozróżniania typów jest powszechne w świecie FP, ale wydaje mi się to trochę ... niezwykłe ... dla mnie w świecie oo. –

Powiązane problemy