/ / Czy jest jakiś powód, aby metoda Rubiego zwracała listę splat-list? - ruby, składnia

Czy istnieje jakikolwiek powód, dla którego metoda zwraca Ruby-List? - ruby, składnia

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 № 1

W 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.