2016-07-11 12 views
0

Rubyでは、メソッド呼び出しによって配列から返される共通の値を複数の変数(ただしすべてではない)に割り当てるために、エレガントな単一行の文を検索してきました。繰り返される値をハードコーディングせずにa, x, y = 1, 2, 2:中に、変数のサブセットを並列代入で共通の値に代入する

a, x = 1, 2 
y = x 

目的の核心は、以下のような2行のステートメントを変換することです。したがって、aは1つの値(1)を取得し、一方xyは共通の値(2)を共有します。

a, x = 7.divmod 5 # array [1,2] is unpacked via parallel assignment 
y = x 

これは、同じ結果を持っています

だが、我々はメソッド呼び出しから返された配列を経由して私たちの値を割り当てる代わりに、直接値1, 2を割り当てるので言わせて、ユースケースに例を拡張するには最初のコードサンプルとIntegersを変数に置き換えて、割り当てを動的にすることができます。

この割り当てを1行にまとめる方法をお勧めしますか?ここで私はこれまで考えられてきたカップルのオプションがあります:パラレル割り当てに新しい人のために

n = 7 # number 
m = 5 # divided by 

# Option 1) Store array via inline-variable assignment and append last 
#   element to align values for the parallel assignment 
a, x, y = (t = n.divmod(m)) << t[-1] 

# Option 2) Use Array#values_at to repeat some elements 
a, x, y = n.divmod(m).values_at 0,1,1 

は、this SO postは、標準的な使用方法をカバーしています。

+0

私はあなたが求めている正確に何ができるかわかりません。 '='の右側を凝縮するためにできることの1つは、配列のコピーを自身に追加する '*'演算子を使うことです。たとえば、 '[1、2] * 3 => [1,2,1,2,1,2]です。従って、a、b、c = [1] + [2] * 2は、a、b、c = 1,2,2と同等である。私は実際にこれを行うのが速い多くの状況を考えることはできませんが、それが必要な場合はそこにあります。 – lwassink

+0

1行にしたい、または読みやすいコードが必要ですか? –

+0

@Sergio、理想的には両方。 1行オプションは、ここでの価値よりも複雑さを増すかもしれません。エッジケースのチャレンジは、時には新しいテクニックを掘り起こすこともあるので、投稿すると思っています。 – Cam

答えて

1

別のオプション

a, x, y = 7.divmod(5).tap {|a| a << a[-1]} 
+0

正直なところ、追加割り当てはすべてのオプションの中で最もよく見えます。これより確かに良い。 :) –

+0

@nikkypxの '#tap 'の使用は、新しい変数をスコープに導入しないので、私の最初のオプションよりも改善されています。また、 '#fill'のようなメソッドの使用を可能にすることができます(ブロック内で自己参照を提供していないようです):' a、x、y、z = 7.divmod(5).tap {| a | a.fill(2,2){a [1]}} ' – Cam