Come definisco un metodo su una riga in Ruby?


92

È def greet; puts "hello"; endl'unico modo per definire un metodo su una riga in Ruby?


11
Come puoi vedere dalle risposte, è possibile definire un metodo in modi diversi su una singola riga, ma la domanda è: dovresti? Qualsiasi definizione dovrebbe essere scritta in modo chiaro e pulito per motivi di manutenzione e leggibilità, quindi se la riga singola diventa ingombrante o confusa, allargala. Alcuni linguaggi sembrano incoraggiare la codifica concisa come un modo per essere studiati dal codice, ma lo stile di codifica Ruby incoraggia l'eleganza, la leggibilità e la manutenibilità al di sopra della studiosità. Completa i primi tre e ti inchineremo.
Tin Man

Risposte:



73

Basta dare la risposta completa e fresca:

In generale, evitare metodi a riga singola. Sebbene siano piuttosto popolari in natura, ci sono alcune peculiarità nella loro sintassi di definizione che ne rendono indesiderabile l'uso. In ogni caso, non dovrebbe esserci più di un'espressione in un metodo a riga singola .

# bad
def too_much; something; something_else; end

# okish - notice that the first ; is required
def no_braces_method; body end

# okish - notice that the second ; is optional
def no_braces_method; body; end

# okish - valid syntax, but no ; make it kind of hard to read
def some_method() body end

# good
def some_method
  body
end

Un'eccezione alla regola sono i metodi del corpo vuoto.

# good
def no_op; end

Da bbatsov / guida in stile rubino .


39
def add a,b; a+b end

Il punto e virgola è il terminatore dell'istruzione inline per Ruby

Oppure puoi usare il define_methodmetodo. (Modifica: questo è deprecato in Ruby 1.9)

define_method(:add) {|a,b| a+b }

4
Non sembra essere deprecato in Ruby 2+
michau

9

Un altro modo:

define_method(:greet) { puts 'hello' }

Può essere utilizzato se non si desidera immettere un nuovo ambito per il metodo durante la definizione.


NoMethodError: metodo privato `define_method 'chiamato per Object: Class in Ruby 1.9.3
Jared

3
define_methodè stato "privatizzato" in Ruby 1.9
edgerunner

8

Ancora un altro modo:

def greet() return 'Hello' end

12
In Ruby, il valore restituito da un metodo è il valore restituito dall'ultima istruzione. Non hai bisogno del returnqui dato che non è una clausola di guardia.
Damien

1
Votato perché, sebbene non sia necessario , returnpuò aggiungere leggibilità per chi è meno esperto (o familiare) di Ruby. E 'una di quelle misura con le pinze le cose ...
Potherca
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.