Mogę się mylić, ponieważ nikt o tym nie wspominał, ale miałem również wrażenie, że powodem tego jest także rubinowe dziedzictwo możliwości wywoływania funkcji bez nawiasów.
Arity jest oczywiście zaangażowane, ale odłóżmy to na chwilę i używaj funkcji bez argumentów. W języku takim jak javascript, w którym nawiasy są obowiązkowe, łatwo jest odróżnić przekazanie funkcji jako argumentu od wywołania funkcji. Nazywasz to tylko wtedy, gdy używasz nawiasów.
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
Jak widać, nazywanie go lub nie ma większego znaczenia. Ale eliksir i rubin pozwalają wywoływać funkcje bez nawiasów. Jest to wybór projektowy, który osobiście mi się podoba, ale ma taki efekt uboczny, że nie można użyć samej nazwy bez nawiasów, ponieważ może to oznaczać, że chcesz wywołać funkcję. Po to &
jest. Jeśli pozostawisz arity appart na sekundę, dodanie nazwy funkcji &
oznacza, że jawnie chcesz użyć tej funkcji jako argumentu, a nie tego, co ta funkcja zwraca.
Teraz funkcja anonimowa różni się tym, że jest używana głównie jako argument. Ponownie jest to wybór projektowy, ale uzasadnia to fakt, że jest używany głównie przez funkcje iteracyjne, które przyjmują funkcje jako argumenty. Więc oczywiście nie musisz używać, &
ponieważ są już domyślnie uważane za argumenty. To jest ich cel.
Ostatni problem polega na tym, że czasami trzeba wywoływać je w kodzie, ponieważ nie zawsze są one używane z funkcją typu iteratora lub może sam kodujesz iterator. W przypadku małej historii, ponieważ ruby jest zorientowany obiektowo, głównym sposobem na to było użycie call
metody na obiekcie. W ten sposób można zachować spójność zachowania nieobowiązkowych nawiasów.
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
Teraz ktoś wymyślił skrót, który w zasadzie wygląda jak metoda bez nazwy.
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
Ponownie jest to wybór projektowy. Teraz eliksir nie jest zorientowany obiektowo i dlatego na pewno nie używa pierwszej formy. Nie mogę mówić za José, ale wygląda na to, że w eliksiru zastosowano drugą formę, ponieważ nadal wygląda jak wywołanie funkcji z dodatkową postacią. Jest wystarczająco blisko do wywołania funkcji.
Nie myślałem o wszystkich zaletach i wadach, ale wygląda na to, że w obu językach można uzyskać tylko nawiasy, pod warunkiem, że nawiasy są obowiązkowe dla funkcji anonimowych. Wygląda na to, że to:
Nawiasy obowiązkowe VS Nieznacznie inna notacja
W obu przypadkach robisz wyjątek, ponieważ oba zachowują się inaczej. Ponieważ istnieje różnica, równie dobrze możesz to uczynić oczywistym i wybrać inną notację. Obowiązkowe nawiasy klamrowe wyglądałyby naturalnie w większości przypadków, ale były bardzo mylące, gdy rzeczy nie potoczyły się zgodnie z planem.
Proszę bardzo. To może nie być najlepsze wytłumaczenie na świecie, ponieważ uprościłem większość szczegółów. Większość z nich to wybory projektowe i starałem się podać ich powód, nie oceniając ich. Uwielbiam eliksir, uwielbiam rubin, lubię wywołania funkcji bez nawiasów, ale podobnie jak ty, konsekwencje są czasem mylące.
A w eliksirze jest to tylko ta dodatkowa kropka, podczas gdy w rubinie masz na sobie bloki. Bloki są niesamowite i jestem zaskoczony, jak wiele możesz zrobić za pomocą samych bloków, ale działają one tylko wtedy, gdy potrzebujesz tylko jednej anonimowej funkcji, która jest ostatnim argumentem. Następnie, ponieważ powinieneś być w stanie poradzić sobie z innymi scenariuszami, oto cała metoda / zamieszanie / lambda / proc / block.
W każdym razie ... to jest poza zakresem.