2012-03-24 4 views

答えて

1

少なくともルビー1.9.3において、join方法の両方の用途には同等であると思われます。 Under the hoodの場合、配列の要素は再帰的にパスに変換され、無限再帰を特別に防ぎます。

したがって、これは正常に動作します:

File.join 'a', ['b', ['c']] 

一つは、スプラットオペレータの目的は、再帰を排除することであると主張するかもしれません。

File.join 'a', *['b', ['c']] 

これに相当します:問題は、これがあることである

File.join 'a', 'b', ['c'] 

再帰を解消するためには、アレイとflattenする必要があり、その後スプラットそれ:

File.join 'a', *['b', ['c']].flatten 

パラメータリストのコンテキストでは、s plat演算子は、配列の括弧を "削除"します。それは、この中で結果:

# File.join receives 3 strings as parameters 
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib') 

これとは対照的に:

# File.join receives 2 parameters, one string and one array of strings 
$:.unshift File.join(File.dirname(__FILE__), ['..', 'lib']) 

More information about the splat operator

1

*は引数を平坦化します。スプラットと同等

File.join(File.dirname(__FILE__), ["..", "lib"]) 

:スプラットせずに等価

File.join(File.dirname(__FILE__), "..", "lib") 

私はそれを同じように扱いますFile.joinこの場合には推測します。しかし、documentationはそれらを平坦化する必要があることを示しています。さて、著者が単に配列なしでそれを書かなかったのはなぜか、ORスプラットは別の問題です。