2015-08-25 4 views
5

ich sehe, dass ich eine Liste von Dateien in einem Verzeichnis Wie [] auf einer Klasse arbeitet in Ruby

Dir["*"] 

mit

bekommen kann, wie ich diese Syntax genau lesen, bin soll? Wie ich weiß, können Sie [] verwenden, um einen Wert von einem Array oder Hash abzurufen.

Wie [ist] bei einem Anruf arbeiten?

+3

wie seine nur syntaktischer Zucker Sieht aus, ein Alias ​​für 'Dir.glob ([string, ...], 0)' http://ruby-doc.org/core-2.2.0/Dir.html –

+2

[Dir :: [\]] (http://ruby-doc.org/core-2.0/Dir.html#method-c 5B-5D) ist eine Garten-Sorten-Methode. Um es in Ihrer eigenen Klasse zu definieren: 'Klasse A; def [] (andere); setzt andere; Ende; Ende; A.neu ['Katze'] => "Katze" '. –

+3

für Ihren zweiten Punkt -> http://stackoverflow.com/questions/13767240/ruby-how-to-make-a-public-static-method –

Antwort

4

Von der Ruby Docs entspricht Dir["*"]Dir.glob(["*"]). (Wie bereits ausgeführt, ist es syntactic sugar)

Dir keinen Anruf, es ist eine Klasse, und Objekte von class Dir sind Verzeichnis-Streams, die Sie wie ein Array zugreifen.

In Ihrem speziellen Fall gibt Dir["*"] einen von Dateinamen zurück, die aus dem als Dir[patternString] übergebenen Muster gefunden werden. "*" als ein Muster entspricht null oder mehr Zeichen, mit anderen Worten, es wird alles übereinstimmen, und wird daher eine array aller Dateinamen in diesem Verzeichnis zurückgeben.

Für Ihre zweite Frage, können Sie einfach define it as any other method wie so:

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

Danke, ja, das hat es geklärt. Ich habe meine Frage aktualisiert. Irgendwelche Gedanken an den zweiten Teil davon? –

+0

@cremno, du hast Recht, danke, dass du darauf hingewiesen hast, ich werde updaten – Parker

+0

@PrakashRaman Ich habe die Frage erneut aktualisiert, jetzt wo du die zweite Frage umformest :) – Parker

5

[] einfach eine Methode ist, wie #to_s, #object_id.

usw.

Sie können es definieren für jedes Objekt:

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

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

In Ihrem Fall es als Singleton-Methode, auf diese Weise definiert ist:

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

Verfahren Dir::glob ein Argument nimmt, und bietet ein Array aller Verzeichnisse und Dateien unter dem Argument verschachtelt. (Von dort können Sie den Index des Arrays mit [0] greifen.) Das Argument kann ein Muster enthalten, das mit Flags übereinstimmt. Das Argument (Muster, Flags) kann Optionen ähnlich (aber nicht genau) regulären Ausdrücken sein.

Aus den Dokumenten, einschließlich ein paar Muster/Flags, die für Sie von Interesse sein könnten:

Beachten Sie, dass dieses Muster kein regulärer Ausdruck ist, dann ist es näher an einen Shell-Glob. Siehe File.fnmatch für die Bedeutung des Parameters flags. Beachten Sie, dass die Groß-/Kleinschreibung abhängig von Ihrem System ist (so wird File::FNM_CASEFOLD ignoriert), ebenso wie die Reihenfolge, in der die Ergebnisse zurückgegeben werden.

  • * - Für jede Datei. Kann durch andere Werte im Glob eingeschränkt werden. Entspricht / .* /x in Regexp.
  • [set] - Für jeden ein Zeichen gesetzt. Benimmt sich genau wie Zeichensätze in Regexp, einschließlich Satz Negation ([^a-z]).

Der Kurz von Dir::glob() ist Dir[], obwohl ich die lange Form bevorzugen. Wie Sie oben gesehen haben, kennzeichnet die Verwendung von Klammern ein spezielles Muster/Flag für das Argument. Hier sind einige Beispiele (aus der Dokumentation), die besser das erklären kann:

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

Es ist Ihnen möglich, die [] Methode für Dir neu zu definieren, aber ich will nicht zeigen, wie - viele (und ich) nicht empfehlen affe-patching core Ruby-Klassen und -Module. Sie können die Methode jedoch in einer eigenen Klasse erstellen. Sehen Sie im folgenden:

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

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

Dir ein Objekt wie jedes andere Objekt (es passiert einfach eine Instanz der Klasse Class sein), und [] ist ein Verfahren, wie jede andere Methode (es geschieht nur haben, lustiger Name, und spezielle syntaktische Bequemlichkeiten, die es erlauben, mit einer anderen Syntax als der normalen aufgerufen zu werden.

So definieren Sie es wie jede andere Methode:

class MyClass 
    def self.[](*) end 
end 
Verwandte Themen