2015-08-25 18 views
5

vedo che posso ottenere un elenco di file in una directory utilizzandoCome funziona [] funziona su una classe in Ruby

Dir["*"] 

Come dovrei leggere che la sintassi esattamente? Come so che è possibile utilizzare [] per recuperare un valore da un array o un hash.

In che modo [] funziona su una chiamata?

+3

Sembra suo zucchero sintattico, un alias per 'Dir.glob ([string, ...], 0)' http://ruby-doc.org/core-2.2.0/Dir.html –

+2

[Dir :: [\]] (http://ruby-doc.org/core-2.2.0/Dir.html#method-c- 5B-5D) è un metodo di varietà da giardino. Per definirlo sulla tua classe: 'classe A; def [] (altro); mette altro; fine; fine; A.new ['cat'] => "cat" '. –

+3

per il tuo secondo punto -> http://stackoverflow.com/questions/13767240/ruby-how-to-make-a-public-static-method –

risposta

4

Da Ruby Docs, Dir["*"] equivale a Dir.glob(["*"]). (Come sottolineato, è syntactic sugar)

Dir non è una chiamata, è una classe e gli oggetti di class Dir sono flussi di directory, ai quali si accede come una matrice.

Nel tuo caso specifico, Dir["*"] restituirà uno array di nomi file che vengono trovati dal modello passato come Dir[patternString]. "*" come uno schema corrisponderà a zero o più caratteri, in altre parole, corrisponderà a tutto, e quindi restituirà uno array di tutti i nomi di file in quella directory.

Per la seconda domanda, si può solo define it as any other method in questo modo:

class YourClass 
    def self.[](v) 
    #your code here 
    end 
end 
+0

Grazie, sì, questo lo ha chiarito. Ho aggiornato la mia domanda. Qualche idea della seconda parte di esso? –

+0

@cremno, hai ragione, grazie per averlo indicato, aggiornerò – Parker

+0

@PrakashRaman Ho aggiornato la domanda di nuovo ora che hai riformulato la seconda domanda :) – Parker

5

[] è semplicemente un metodo, come #to_s, #object_id. ecc

È possibile definire su qualsiasi oggetto:

class CoolClass 
    def [](v) 
    puts "hello #{v}" 
    end 
end 

CoolClass.new["John"] # => "hello John" 

Nel tuo caso è definita come metodo di Singleton, in questo modo:

class Dir 
    def self.[](v) 
    ... 
    end 
end 
2

Il metodo Dir::glob prende un argomento, e fornisce una matrice di tutti i file di directory e nidificati sotto l'argomento. (Da lì, è possibile prendere l'indice dell'array con [0].) L'argomento può includere un modello da abbinare, insieme a flag. L'argomento (pattern, flags) può essere opzioni simili (ma non esattamente) espressioni regolari.

Dalla documentazione, tra cui un paio di modelli/bandiere che possono essere di interesse per voi:

Nota che questo modello non è una regexp, è più vicino a un glob di shell. Vedi File.fnmatch per il significato del parametro flags. Notare che la distinzione tra maiuscole e minuscole dipende dal sistema in uso (quindi File::FNM_CASEFOLD viene ignorata), così come l'ordine in cui vengono restituiti i risultati.

  • * - Corrisponde a qualsiasi file. Può essere limitato da altri valori nel glob. Equivalente a / .* /x in regexp.
  • [set] - Corrisponde a qualsiasi carattere nel set. Funziona esattamente come i set di caratteri in Regexp, inclusa la negazione dell'impostazione ([^a-z]).

La scorciatoia di Dir::glob() è Dir[], anche se io preferisco la forma a lungo. Come hai visto sopra, usare le parentesi denota uno schema/flag speciale per l'argomento. Ecco alcuni esempi (dalla documentazione) che possono meglio spiegare questo:

Dir["config.?"]      #=> ["config.h"] 
Dir.glob("config.?")    #=> ["config.h"] 
Dir.glob("*.[a-z][a-z]")   #=> ["main.rb"] 
Dir.glob("*")      #=> ["config.h", "main.rb"] 

E 'possibile per voi per ridefinire il metodo [] per Dir, ma non voglio mostrare come - molti (e io) non lo fanno raccomandare classi e moduli Ruby core di patch-patch. Tuttavia, puoi creare il metodo in una classe personalizzata. Vedere la seguente:

class User 
    # Class method => User.new[arg] 
    def self.[](arg) 
    end 

    # Instance method => @user[arg] 
    def [](arg) 
    end 
end 
1

Dir è un oggetto come qualsiasi altro oggetto (accade solo per essere un'istanza della classe Class), e [] è un metodo come qualsiasi altro metodo (succede solo per avere un nome divertente e speciali comodità sintattiche che consentono di chiamare usando una sintassi diversa da quella normale).

Quindi, si definisce come qualsiasi altro metodo:

class MyClass 
    def self.[](*) end 
end 
Problemi correlati