سؤال

أواجه شيئًا لا أفهمه تمامًا.

لدي صفيف هي عناصرها صفيفات.

لذلك لديّ حلقتان متداخلتان ، في الحلقة الداخلية ، أملأ صفيفها الداخلي ثم في الحلقة الخارجية ، أملأ الصفيف الخارجي بالمصفوفة الداخلية.

arr=[]
mat=[]
for m in (0..1)
  for k in (0..1)
    arr[k]=rand.to_s
  end
  mat[m]=arr
end

في نهاية المصفوفة الخاصة بي مليئة بصفيف. تحتوي كل صفيف على القيم المحسوبة في التكرار الأخير. إذا أردت أن يحتوي العنصر الأول في Matrix على أول صفيف محسوب ، فسيتعين علي إعادة تهيئة كائن ARR في كل حلقة. لذلك يبدو أن المهمة تتم بالرجوع إليها حتى يتم تنظيف كائن ARR. إذا أضفت

mat[m]=arr
arr=[]

جميع الأعمال كما هو متوقع: سوف تحتوي MAT [0] على الصفيف المحسوب في الحلقة الأولى ، وستحتوي MAT [1] على الصفيف المحسوب في الحلقة الثانية.

هل هذا حسب التصميم أم أنه تأثير جانبي غير مرغوب فيه؟ لا يحدث هذا إلا إذا قمت بتعيين صفائف كعناصر صفيف. إذا كان املأ صفيفًا بمتغيرات سلسلة بسيطة في حلقة ، فكل ما هو متوقع.

أعلم أنه من الجيد ممارسة البرمجة لتجنب إعادة استخدام الكائنات ، لكن هذا السلوك غريب على أي حال.

هل كانت مفيدة؟

المحلول

مشكلتك هي أن محتويات متغير arr الخاص بك يتم الكتابة عليها مع كل تكرار: arr[k] الكتابة فوق كل ما هو هناك بالفعل. يجب أن يكون متغير ARR محليًا إلى الكتلة بدلاً من ذلك:

mat = []
2.times do             # avoid for... use iterators instead
  row = []
  2.times do 
    row << rand.to_s
  end
  mat << row
end

نصائح أخرى

أنا أحب نهج باستخدام التجزئة بدلاً من المصفوفات متعددة الأبعاد.

وماذا عن هذا:

def creat­e_matrix x, y, conte­nt = nil, &block
  rows = (0...x­).to_a
  cols = (0...y­).to_a
  indices = rows.­product cols
  matrix = {}
  indices.ea­ch { |inde­x| matri­x[index] = ( block­_given? ? yield­( index ) : conte­nt ) }
  matrix
end

ثم افعل:

matrix = create_matrix( 2, 2 ) { rand.to_s }

ستحصل على تجزئة ، يمكنك الوصول إليها مثل هذا:

matrix[[0, 1]] #note the double brackets

طريقة أخرى للقيام بذلك:

(1..4).map{rand}.each_slice(2).to_a
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top