def foo(x:Int, f:Unit=>Int) = println(f())
foo(2, {Unit => 3+4}
//case1
def loop:Int = 7
foo(2, loop) //does not compile
changing loop to
//case 2
def loop():Int = 7
foo(2, loop) // does not compile
changing loop to
//case 3
def loop(x:Unit): Int = 7 //changing according to Don's Comments
foo(2,loop) // compiles and works fine
should'nt case 1 and case 2 also work? dlaczego oni nie działają?Funkcje bez argumentów, z jednostką jako argumentem w scala
definiowania foo jako
def foo(x:Int, y:()=>Int)
wówczas przypadek 2 działa, ale nie Przypadek 1.
Arent wszyscy powinni pracować, definiowanie funkcji w obu kierunkach.
// również myślę() => Int in foo to zły styl, y: => Int nie działa, komentarze ??
def definiuje metody (które nie należą do pierwszej klasy), a nie funkcje (które * są * pierwszą klasą). Częściowa aplikacja przenosi metody do funkcji, gdy ich potrzebujesz. –
Czy możesz proszę rozwinąć .. Nie dostałem. Czy miałeś na myśli to, że defa nie mogą zostać przekazane. tj. powyższa "pętla" nie może być przekazana innym funkcjom? – scout
Prawidłowo. Kiedy mówimy "pierwsza klasa", mamy na myśli taki sam status, jak każda inna wartość, na przykład Int, String lub instancja klasy zdefiniowanej przez użytkownika. Metody nie mogą być traktowane w ten sposób (można je tylko wywoływać). Z drugiej strony funkcje (które są instancjami (podklasami) FunctionN (gdzie N jest liczbą argumentów)) są pierwiastkami pierwszej klasy z oczywistego powodu, że są instancjami klasy. –