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?
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?
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
[]
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
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, żeFile::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
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
Wygląda jego cukru tylko składniowej, alias dla 'Dir.glob ([ciąg, ...], 0)' http://ruby-doc.org/core-2.2.0/Dir.html –
[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" '. –
dla twojego drugiego punktu -> http://stackoverflow.com/questions/13767240/ruby-how-to-make-a-public-static-method –