2014-06-13 23 views
6

Quando si utilizza method_missing in Ruby, è almost always a good idea definire anche respond_to_missing?.Il secondo argomento di `respond_to_missing?` È utile per qualcosa?

respond_to_missing? accetta due argomenti; il nome del metodo che stiamo verificando (symbol) e un valore booleano che indica se dovremmo includere metodi privati ​​nel nostro assegno (include_all).

Ora qui è quello che mi sono confuso su: method_missing non accetta argomenti che potrebbero indicare ad esso se deve chiamare i metodi privati ​​o no, come respond_to_missing? fa. Inoltre, method_missing viene chiamato indipendentemente dal fatto che la chiamata al metodo originale fosse in un contesto pubblico o privato e indipendentemente da ciò che restituisce respond_to_missing? per il metodo specificato nel contesto appropriato. Quindi tutte le operazioni di method_missing sono accessibili pubblicamente.

Se questo è il caso, allora a cosa serve il secondo argomento per respond_to_missing? (include_all)? Se l'oggetto dato risponde a un metodo mancante non è possibile che sia influenzato dal contesto in cui è stato chiamato il metodo mancante, quindi perché persino avere questo argomento?

risposta

3

Penso che respond_to_missing? abbia un secondo argomento per lo stesso motivo per cui lo fa respond_to?. In entrambi i casi, consente al codice di chiedere a un oggetto i metodi a cui risponde in modo da rispettare la privacy del metodo. Se usato correttamente, può aiutarti a incapsulare meglio gli oggetti.

È stata rilevata una funzionalità mancante in method_missing, ovvero che dovrebbe avere un argomento che indica se il metodo è stato chiamato in un contesto pubblico o privato. Forse method_missing avrà questa caratteristica un giorno. Fino ad allora, tutte le funzionalità dell'oggetto implementato tramite method_missing saranno effettivamente pubbliche, ma è comunque possibile scoraggiare le persone dall'utilizzarlo nella documentazione e tramite respond_to_missing?.

+1

Hmm ... quindi stai dicendo che anche se attualmente non c'è modo di rendere privato un metodo mancante, potresti usare 'respond_to_missing? 'Per imitare parzialmente quel comportamento non pubblicizzando l'esistenza di metodi mancanti che potresti vuoi essere privato? – Ajedi32

+0

Sì, è giusto. –

0

method_missing non accetta argomenti che potrebbero indicare ad esso se deve chiamare i metodi privati ​​o no

method_missing() non chiamare i metodi pubblici o privati. method_missing() viene chiamato alla fine del percorso di ricerca del metodo quando non è possibile trovare un metodo. Quindi il confronto di method_missing() e respond_to * non è sensoriale. Perché pensi che debbano operare nello stesso modo? respond_to?() non è mai stato simmetrico con method_missing() in primo luogo.

+0

"method_missing() non chiama metodi pubblici o privati" Bene, potrebbe. Il mio punto è che il metodo mancante può essere usato per simulare l'esistenza di "metodi" che in realtà non esistono. Questi "metodi", ** devono ** essere pubblici, dato che 'method_missing' non ha conoscenza del contesto pubblico/privato in cui viene chiamato il" metodo "mancante. Pertanto, poiché tutti i "metodi" mancanti sono pubblici, perché avrebbe senso per "respond_to_missing?" Avere un secondo argomento che consenta di restituire valori diversi a seconda che stiamo cercando metodi "privati" o "pubblici" " "? – Ajedi32

+0

Nota le virgolette: quando dico "metodo", intendo il metodo inesistente che 'method_missing' sta simulando l'esistenza di. – Ajedi32

Problemi correlati