W kodzie źródłowym języka Ruby, lib/fileutils.rb
, metoda mkdir_p
wygląda tak po uproszczeniu:
def mkdir_p(list, options={})
return *list if options[:noop]
# ...
return *list
end
Zarówno z tego, co rozumiem o Rubim, jak iz testów, nie ma tu sensu splat. Czy jest jakiś wyjątkowy przypadek, w którym ma to znaczenie?
W związku z tym, jeśli nie ma przypadku krawędzi, w którym ma to wpływ na wynik, czy ikona jest całkowicie nieszkodliwa, czy też powoduje, że interpreter języka Ruby wykonuje dodatkową (niepotrzebną) pracę?
Odpowiedzi:
8 dla odpowiedzi № 1W rzeczywistości istnieją różnice między return l
i return *l
; pomaga wiedzieć, czego szukać.
Jedną ważną różnicą jest to, że robi Kopiuj tablicy lub zmaterializowany Enumerator - a Nowy We wszystkich przypadkach zwracana jest tablica.
def x(l)
return *l
end
p = ["hello"]
q = x(p)
q[0] = "world"
# p -> ["hello"]
# q -> ["world"]
u = x(0.upto(2))
# u -> [0, 1, 2] - Enumeration is forced
Inną różnicą jest to, że operator splat będzie zmuszał nil
do pustej tablicy i wymusi inne (inne niż Array / Enumerator) wartości na Array jednego elementu - ponownie, Nowy We wszystkich przypadkach zwracana jest tablica.
r = x(nil)
# r -> []
s = x("one")
# s -> ["one"]
W związku z tym używanie return *l
ma subtelne implikacje, które, miejmy nadzieję, są wystarczająco dobrze opisane w dokumentacji metody lub w inny sposób „nie są zaskakujące” w użyciu.