2015-08-25 12 views
5

widzę, że mogę uzyskać listę plików w katalogu z użyciemJak [] działa na klasy w Ruby

Dir["*"] 

Jak mam czytać dokładnie tę składnię? Jak wiem, możesz użyć [], aby pobrać wartość z tablicy lub skrótu.

Jak działa [] w przypadku połączenia?

+3

Wygląda jego cukru tylko składniowej, alias dla 'Dir.glob ([ciąg, ...], 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) jest metodą odmiany ogrodowej. Aby zdefiniować go na własnej klasie: 'klasa A; def [] (inne); stawia inne; koniec; koniec; A.new ['cat'] => "cat" '. –

+3

dla twojego drugiego punktu -> http://stackoverflow.com/questions/13767240/ruby-how-to-make-a-public-static-method –

Odpowiedz

4

Od Ruby Docs, Dir["*"] jest równoważna Dir.glob(["*"]). (Jak wspomniano, to jest to syntactic sugar) nie jest połączeniem, jest klasą, a obiekty class Dir są strumieniami katalogów, do których uzyskujesz dostęp jak tablica.

W konkretnym przypadku Dir["*"] zwróci array nazw plików znalezionych z wzorca przekazanego jako Dir[patternString]. "*" jako wzorzec będzie pasował do zera lub większej liczby znaków, innymi słowy będzie pasował do wszystkiego, a zatem zwróci array wszystkich nazw plików w tym katalogu.

Na drugie pytanie, jak można po prostu define it as any other method więc:

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

Dzięki, tak, to wyjaśniło. Zaktualizowałem moje pytanie. Jakieś myśli o drugiej części? –

+0

@ cremno, masz rację, dziękuję za wskazanie tego, będę aktualizować – Parker

+0

@PrakashRaman Zaktualizowałem pytanie ponownie, gdy ponownie sformułowałeś drugie pytanie :) – Parker

5

[] to po prostu sposób, jak #to_s, #object_id. itp

Można zdefiniować go na dowolnym obiekcie:

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

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

w Twoim przypadku jest zdefiniowana jako metody singleton, w ten sposób:

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

Sposób Dir::glob przyjmuje argument i dostarcza tablica wszystkich plików katalogów i zagnieżdżona pod argumentem. (Stamtąd można pobrać indeks tablicy za pomocą [0].) Argument może zawierać wzorzec do dopasowania, wraz z flagami. Argument (wzorzec, flagi) może być wartością podobnych (ale nie dokładnie) wyrażeń regularnych.

Od docs, w tym kilka wzorów/flagi, które mogą być interesujące dla Ciebie:

Zauważ, że ten wzór nie jest wyrażeniem regularnym, to bliżej glob powłoki. Zobacz File.fnmatch dla znaczenia parametru flags. Zwróć uwagę, że wielkość liter zależy od systemu (tak, że File::FNM_CASEFOLD jest ignorowana), podobnie jak kolejność, w jakiej zwracane są wyniki.

  • * - Dopasowuje dowolny plik. Może być ograniczony przez inne wartości w glob. Równoważny z / .* /x w wyrażeniu regularnym.
  • [set] - Dopasowuje dowolną postać w zestawie. Zachowuje się dokładnie tak, jak zestawy znaków w Regexp, w tym ustawiona negacja ([^a-z]).

skrótowym z Dir::glob() jest Dir[], chociaż wolę długi formularz. Jak widać powyżej, użycie nawiasów oznacza specjalny wzorzec/flagę dla argumentu. Oto kilka przykładów (od docs), które mogą lepiej wyjaśnić:

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

Jest możliwe, aby przedefiniować metody [] dla Dir, ale nie pokaże, w jaki sposób - wiele (i ja) nie polecam podstawowe klasy i moduły Ruby z łataniem małp. Możesz jednak utworzyć metodę w klasie własnej. Zobacz:

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

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

Dir Przedmiotem jak każdy inny obiekt (to okazuje się być przykładem klasy Class) i [] jest sposób jak każdy inny sposób (to okazuje się mieć śmieszne imię i specjalne syntaktyczne udogodnienia, które pozwalają na wywoływanie przy użyciu innej składni oprócz normalnej).

Tak, można zdefiniować ją tak samo jak każdą inną metodą:

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