2012-04-06 14 views
5

Sono un po 'confuso riguardo alle parole riservate in Ruby.Le parole riservate "inizio" e "fine" sono o no?

"The Ruby Programming Language", scritto da Matz, afferma che begin e end sono parole riservate della lingua. Sono certamente usati sintatticamente per delimitare i blocchi.

Tuttavia, oggetti intervallo nella lingua hanno metodi di nome begin e end, come in

(1..10).end 
=> 10 

Ora, testare questo fuori, trovo che, anzi, posso definire metodi chiamati "begin" e "end "sugli oggetti, anche se provo a nominare una variabile" begin "fallisce. (Ecco un esempio di utilizzarlo come un nome di metodo, funziona davvero ... :)

class Foo 
    def begin 
    puts "hi" 
    end 
end 

Foo.new.begin 

Quindi, suppongo che sto chiedendo, ciò che in realtà è lo stato delle parole riservate come questo? Avrei immaginato che non potessero essere usati per i nomi dei metodi (eppure sembra funzionare) o che per lo meno sarebbe uno stile terribile (ma è effettivamente usato nel linguaggio di base per la classe Range).

Sono abbastanza confuso su quando possono essere utilizzati e per cosa. C'è anche la documentazione su questo?

risposta

10

Sì, sono parole riservate. Sì, possono essere utilizzati per i nomi dei metodi. No, non puoi chiamarli senza un ricevitore esplicito. Probabilmente non è comunque una buona idea.

class Foo 
    def if(foo) 
    puts foo 
    end 
end 

Foo.new.if("foo") # outputs foo, returns nil 

Aggiornamento: Ecco una citazione da "The Ruby Programming Language", di Matz (il creatore di Ruby) se stesso:

Nella maggior parte delle lingue, queste parole sarebbero chiamati “parole riservate "E non sarebbero mai consentiti come identificatori. Il parser Ruby è flessibile e non si lamenta se si prefissano queste parole chiave con @, @@, o $ prefissi e li usano come nomi di istanza, classe o variabile globale . Inoltre, è possibile utilizzare queste parole chiave come i nomi dei metodi, con l'avvertenza che il metodo deve sempre essere invocata esplicitamente attraverso un oggetto .

+0

È vero per tutte le "parole riservate"? Se è in cattivo stile, perché l'API di base lo fa? (Anche se intuitivamente sembra uno stile orribile - anzi, una cosa terribile per la lingua permettere a tutti.) E, * è documentato *? – Perry

+0

È permesso perché a volte avere dei metodi chiamati come una parola riservata può avere senso (IMHO 'Range # end') è un buon esempio. Le cose non sono sempre in bianco e nero, come la maggior parte delle funzionalità che potrebbero essere utili se usate con cura. Per quanto riguarda la documentazione, una rapida ricerca su Google ha trovato http://www.tutorialspoint.com/ruby/ruby_syntax.htm, che afferma che "[queste] parole riservate non possono essere usate come nomi di costanti o variabili. , essere usato come nomi di metodi ", che IMHO ha perfettamente senso. –

+0

Tuttavia non sembra essere una documentazione ufficiale. (Non ho trovato alcuna menzione nei documenti ufficiali, sebbene ciò non implichi che non esiste.) – Perry

2

Quando vengono dati in una forma che è inequivocabilmente una chiamata al metodo, è possibile utilizzarli. Se si dispone di un periodo di fronte ad essa .begin o hanno parentesi dopo è begin(), allora è inequivocabilmente una chiamata di metodo. Quando si tenta di utilizzarlo come variabile begin, è ambiguo (in linea di principio).

In realtà, come nota Perry, begin() potrebbe essere difficile. Ho controllato con IRB con Ruby 1.9.3, e la seguente cosa strana succede:

irb(main):001:0> def begin(foo) 
irb(main):002:1> puts 'a' 
irb(main):003:1> end 
=> nil 
irb(main):004:0> begin(3) 
irb(main):005:1> 
irb(main):006:1* end 
=> 3 

non è definito, e quello che sembra una chiamata di metodo potrebbe essere solo un blocco che restituisca l'ultimo valutati 3. Ma le linee intorno allo def begin(foo) rimangono misteriose.

+1

Il tuo reclamo sulle parentesi sembra essere falso, almeno in Ruby 1.9.3 - begin() non sembra funzionare per me. – Perry

+0

@sawa Niente di strano qui. Le parentesi sono interpretate come - inutili - parentesi attorno al corpo del blocco. Ecco perché il 3 viene restituito così com'è. Wy la prima definizione è un mistero che non capisco, tutte le definizioni dei metodi restituiscono 'nil' e' self.methods.grep (/ beg /) # => [: begin] '. Se si digita 'send (: begin)' in IRB, funzionerà. –

+0

@MichaelKohl Cosa viene definito nella definizione che inizia con 'def begin (foo)'? – sawa

Problemi correlati