2011-08-12 6 views
0

ruby​​の構造化解除に関する最近の良いarticleは、通常、値を1つの変数にバインドすることができる場所であれば、一連の変数を対応する値のセットにバインドする機能として、この場合Rubyのブロック引数を動的に破壊する

triples = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

triples.each { |(first, second, third)| puts second } =>#[2, 5, 8] 

構造化代入我々はメインアレイ内の要素の数のアイデアを持って、我々は最初の引数を提供する場合、したがって、第二、第三の発明者らは、対応する結果を得ることができます。したがって、実行時にサイズが決定される配列の配列があったらどうでしょうか?

triples = [[1, 2, 3], [4, 5, 6], [7, 8, 9],...,[]] 

各サブアレイの最初のエントリの要素を取得したいと思いますか?

triples.each { |(first, second, third,...,n)| puts first } 

(first, second, third,...,n)動的にローカル変数を作成するための最良の方法は何ですか?あなたの特定のケースで

+0

しかし、なぜ変数を動的に作成する必要がありますか? – Geo

+0

私は各サブアレイのn番目の要素を取得したいからです。たとえば、サブタイトルごとにn番目のインデックスの要素を取得したいので、たとえば – eastafri

+0

の20番目とします。サブアレイに31以上の要素が含まれている場合、各サブアレイの31番目のインデックスの要素。 – eastafri

答えて

5

、あなたは最初の値が、すべてを収集するためにスプラットを使用したい:

triples.each { |first, *rest| puts first } 
#-----------------------^splat 

*rest表記はちょうどrestと呼ばれる配列に残っているすべてのものを収集します。

一般的に、ローカル変数(second, third, ..., nth)の任意の数を作成することには、何もできないのであまり意味がありません。あなたはおそらく病気のようなエバールを取り払うことができるかもしれませんが、私たちはすでに上級で機能的なArrayクラスを持っています。

+0

各サブアレイのn番目のインデックスの要素を取得したいとします。 – eastafri

+1

@eastafri:あなたは 'each {| x |あなたが '| first、* rest | 'を持っていれば' x [n-1] 'や' rest [n-2] 'と言うことができます。 '| k、v |' "destructuring"構文は、作業している要素の数や 'a、b = [11,23]'のようなものを知っているときに使うのが便利です。あなたが持っている要素の数を知っていて、配列を使って、それがどれほど大きいかを尋ねます。 –

1

これは、配列の配列である場合:

triples = [[1, 2, 3], [4, 5, 6], [7, 8, 9],...,[]] 

と内側の配列がわずか3つの要素それぞれを持っているので、私たちは、これは動作しますが、トリプルを反復します。

triples.each { |first, second, third| puts first } 

または、入力することを意味しましたか?この場合

new_triples = [[1, 2, 3,...,n], [4, 5, 6,...,n], [7, 8, 9,...,n],...,[]] 

、私は

new_triples.each { |first, *rest| puts first } 

上で「ムー」の提案を使用することになり、私は申し訳ありませんがそれ以外の場合は、あなたの意図をキャプチャしている願っています。

関連する問題