Czy ktoś może wyjaśnić opcje skrótów? Pracuję na kursie ruby od testfirst.org. Ćwiczenie 10 (temperatura_obiektu) wymaga znajomości opcji skrótów.Co to są opcje skrótów?
Odpowiedz
Mieszanie opcji jest ładną koncepcją włączoną przez funkcję analizatora składni ruby. Powiedzmy, że masz metodę z pewnymi wymaganymi argumentami. Możesz także przekazać kilka opcjonalnych argumentów. Z biegiem czasu możesz dodać więcej argumentów opcjonalnych lub usunąć stare. Aby deklaracja metody była czysta i stabilna, można przekazać wszystkie te opcjonalne argumenty w haszowaniu. Taki sposób będzie wyglądać następująco:
def foo(arg1, arg2, opts = {})
opts.to_s # just return a string value of opts
end
Więc to ma dwa wymagane wartości i ostatni argument z domyślnej wartości hash. Jeśli nie masz żadnych argumentów opcjonalnych do przekazania, to nazwać tak:
foo(1, 2) # => "{}"
Jeśli masz coś opcjonalne, to nazwać tak:
foo(1, 2, {truncate: true, redirect_to: '/'}) # => "{:truncate=>true, :redirect_to=>\"/\"}"
Kod ten jest tak idiomatyczne ruby, że jego parser rzeczywiście pozwala pominąć nawiasy klamrowe podczas przechodzenia hash jako ostatni argument do metody:
foo(1, 2, truncate: true, redirect_to: '/') # => "{:truncate=>true, :redirect_to=>\"/\"}"
Jeśli używasz szyny, na przykład, zobaczysz opcje nagłówków lub wszędzie. Tutaj, otworzyłem tylko losowy kontrolera w mojej aplikacji:
class ProductsController < ApplicationController
before_filter :prepare_search_params, only: :index
# ^^^^^^^^^^ options hash here
Tak więc, w krótkim: Opcje mieszania jest argumentem metody, który znajduje sie ostatni i ma domyślną wartość {}
. I zwykle przekazuje się do niego hashe (stąd nazwa).
z opcjami mieszania odnosi się do konwencji możliwości przejścia do metod przy użyciu mieszania ({}
) podobnie jak
my_func(arg1, arg2, {:opt1 => 'foo', :opt2 => 'bar'})
Konwencja dla opcji Hash jest ostatnim argumentem tak, że może być opcjonalnie . Na przykład.
def my_func(argument1, argument2, options = {})
...
end
A więc hash opcji nie jest niczym specjalnym. To tylko opcjonalny końcowy argument, który jest hash. Opcje hashe są tak poręczne i powszechne, że interpreter pozwala także zostawić poza nawiasami (jest to jeden „specjalne” część o nich)
my_func(arg1, arg2, :opt1 => 'foo', :opt2 => 'bar')
połączeniu z symbolem krzyżyka klawisz skrótu Ruby i opcjonalnych nawiasach, to może skończyć patrząc naprawdę czyste:
my_func arg1, arg2, opt1: 'foo', opt2: 'bar'
Odwrócona Merge jest najlepszym sposobem wdrożenia opcji mieszań w ruby / szyny:
def set_state_application(options_hash)
options_hash.reverse_merge!(send_email: true, other_default_val: 'a') #will set defaults
self.update_column(:status_id, VendorEnums::VendorStatus::APPLICATION)
VendorMailer.email_application(self) if options_hash[:send_email]
save_state
end
opcje skróty stosowane są dużo gdy n przekazać opcjonalne argumenty do metody.
Na przykład, jeśli metoda ma jeden-dwa opcjonalne argumenty, można napisać
def method(arg1, arg2 = nil, arg3 = nil)
...
end
Ale jeśli masz więcej opcjonalnego argumentu robi się brzydkie, aby przypisać je do zera za każdym razem. Nadchodzi hash opcji, które pozwala na pisanie
def method(arg1, options={})
@arg1 = arg1
@arg2 = options[:arg2]
....
@arg15 = options[:arg15]
end
Ponieważ wszystkie te odpowiedzi są poprawne, rubin 2 ulepszone wsparcie dla słów kluczowych argumentów.
Możesz zdefiniować swoją metodę z domyślnymi hashami jako *args
i usunąć options = {}
.
def foo(bar: 'initial')
puts bar
end
foo # => 'initial'
foo(bar: 'final') # => 'final'
Wymagane argumenty trzeba dwukropek po kluczu (również trzeba ruby 2.1)
def foo(bar:)
puts bar
end
foo # => ArgumentError: missing keyword: bar
foo(bar: 'baz') # => 'baz'
opcjonalne argumenty, można ustawić domyślne do nil
def foo(bar: nil, baz: 'aaa')
puts "#{bar}:#{baz}"
end
foo # => ':aaa'
foo(baz: 'zab') # => ':zab'
foo(bar: 'rab', baz: 'zab') # => 'rab:zab'
foo(bin: 'bin') # => ArgumentError: unknown keyword: bin
także może wykorzystywać standardowe argumenty pozycyjne z tą nową notacją parametrów skrótu. Więcej informacji można znaleźć w tym dokumencie: blog i oficial.
Bonus: Refaktor jest łatwy, ponieważ możesz pozbyć się opcji mieszania swojej metody bez zmiany jej połączeń. Ale ... to nie jest do końca prawdą, jeśli masz połączenie z nieoczekiwaną opcją, dostaniesz ArgumentError: unknown keyword: invalid_arg
.
- 1. Co to są opcje + FollowSymLinks?
- 2. Co to jest uwierzytelnianie skrótów?
- 3. Co to są opcje wiersza poleceń dla IDE VB6 (kompilator)
- 4. Co to są wszystkie opcje linii poleceń Maven?
- 5. Co to jest kontrola skrótów klawiaturowych?
- 6. Co to są `+:` i `-:`?
- 7. Co to są pojęcia?
- 8. Co to są CoreDataGeneratedAccessors?
- 9. Co to są fortuny?
- 10. Co to są RFC?
- 11. Co to jest "opcje" w Backbone.js?
- 12. Co to są ReservedCodeCacheSize i InitialCodeCacheSize?
- 13. Co to są "pilne dane"?
- 14. Co to są ograniczone szablony?
- 15. Co to są Iteratory SCARY?
- 16. Co to są operatorzy zniesione?
- 17. Co to są błędy xsession?
- 18. Co to są pliki FTL
- 19. Co to są hipotetyczne indeksy?
- 20. Co to są połączenia ZygoteInit?
- 21. Co to są czyste zmienne?
- 22. Co to są moduły CSS3?
- 23. Co to są pojemniki w Javie
- 24. Co to są pliki .pidb MonoDevelop?
- 25. Co to są usługi internetowe REST?
- 26. Co to są kości Potężnego CMS
- 27. Co to są pliki .tpl.html? (angularjs)
- 28. Co to są klasy encji w php
- 29. Co to są pliki `rc` w nodejs?
- 30. Co to są zmienne specyficzne dla procesu?
W nowoczesnej wersji Ruby powinieneś naprawdę używać argumentów słów kluczowych zamiast skrótu opcji. –
@ JörgWMittag czy możesz wyjaśnić? – Dennis
@Dennis: google "argumenty ruby słów kluczowych" –