Jeśli zdefiniuję funkcje Rubiego w ten sposób:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Jak mogę to nazwać dostarczaniem tylko pierwszych 2 i ostatnich argumentów? Dlaczego coś takiego nie jest
ldap_get( base_dn, filter, , X)
jest możliwe, a jeśli to możliwe, jak to zrobić?
ruby
optional-parameters
Bruno Antunes
źródło
źródło
scope
true i przepuszczaszfalse
,scope ||= true
nie zadziała. Ocenia to samo, conil
i ustawi natrue
xyz||=true
. Mówi, że jeśli jest zero, to zawsze prawda. Jeśli to prawda, to prawda.scope ||= true
jest, jestem zaskoczony, że nikt nie wspomniał, że lepszym sposobem na to jest użyciescope = LDAP::LDAP_SCOPE_SUBTREE if scope.nil?
. Oczywiście nawet przy założeniu, żenil
jest to nieprawidłowa wartość.nil
. Niektórym może się spodobać notacja:ldap_get(base_dn, filter, _, X)
(uwaga: nie wiem (jeszcze) kiedy to zostało wprowadzone w Rubim. Ciekawy wątek SO ).Prawie zawsze lepiej jest używać skrótu opcji.
źródło
options = default_options.merge(options)
Czas minął i od wersji 2 Ruby obsługuje nazwane parametry:
źródło
Nie można tego zrobić tak, jak zdefiniowałeś
ldap_get
. Jeśli jednak zdefiniujesz wldap_get
ten sposób:Teraz możesz:
Ale teraz masz problem, że nie możesz go wywołać z dwoma pierwszymi argumentami i ostatnim argumentem (ten sam problem co wcześniej, ale teraz ostatni argument jest inny).
Przyczyna tego jest prosta: każdy argument w Rubim nie musi mieć wartości domyślnej, więc nie można go nazwać w sposób określony przez użytkownika. Na przykład w twoim przypadku pierwsze dwa argumenty nie mają wartości domyślnych.
źródło
1) Nie możesz przeciążać metody ( dlaczego ruby nie obsługuje przeciążania metod? ), Więc dlaczego nie napisać zupełnie nowej metody?
2) Podobny problem rozwiązałem używając operatora splat * dla tablicy o zerowej lub większej długości. Następnie, jeśli chcę przekazać parametr (y), który mogę, jest on interpretowany jako tablica, ale jeśli chcę wywołać metodę bez żadnego parametru, nie muszę niczego przekazywać. Patrz język programowania Ruby na stronach 186/187
źródło
Ostatnio znalazłem sposób na obejście tego. Chciałem stworzyć metodę w klasie tablicy z opcjonalnym parametrem, aby zachować lub odrzucić elementy w tablicy.
Sposób, w jaki to zasymulowałem, polegał na przekazaniu tablicy jako parametru, a następnie sprawdzeniu, czy wartość w tym indeksie wynosi zero, czy nie.
Wypróbuj naszą metodę klasową z różnymi parametrami:
wynik:
["1", "2", "a", "b", "c"]
Dobra, fajnie, działa zgodnie z planem. Teraz sprawdźmy i zobaczmy, co się stanie, jeśli nie przekażemy trzeciej opcji parametru (1) w tablicy.
wynik:
["a", "b", "c"]
Jak widać, trzecia opcja w tablicy została usunięta, inicjując w ten sposób inną sekcję w metodzie i usuwając wszystkie wartości ASCII, które nie znajdują się w naszym zakresie (32-126)
Alternatywnie moglibyśmy ustawić wartość jako zero w parametrach. Który wyglądałby podobnie do następującego bloku kodu:
źródło
Jest to możliwe :) Wystarczy zmienić definicję
do
zakres będzie teraz w tablicy na pierwszym miejscu. Kiedy podasz 3 argumenty, to przypiszesz base_dn, filter i attrs, a param_array będzie [] Gdy 4 i więcej argumentów, wtedy param_array będzie [argument1, or_more, and_more]
Wadą jest… to niejasne rozwiązanie, naprawdę brzydkie. To jest odpowiedź, że można pominąć argument w środku wywołania funkcji w Rubim :)
Kolejną rzeczą, którą musisz zrobić, jest przepisanie domyślnej wartości zasięgu.
źródło
attrs=nil
) po splat (*param_array
).¶meter
, ale w Ruby 1.9 mógł po nim również występować „zwykłe parametry”. W żadnym przypadku parametr z wartością domyślną nie był dozwolony po parametrze z ikoną.Można to zrobić za pomocą częściowej aplikacji, chociaż używanie nazwanych zmiennych zdecydowanie prowadzi do bardziej czytelnego kodu. John Resig napisał artykuł na blogu w 2008 roku o tym, jak to zrobić w JavaScript: http://ejohn.org/blog/partial-functions-in-javascript/
Prawdopodobnie byłoby możliwe zastosowanie tej samej zasady w Rubim (z wyjątkiem dziedziczenia prototypów).
źródło