문제

나는 내가 완전히 이해하지 못하는 것을 직면하고 있습니다.

요소가 배열 인 배열이 있습니다.

그래서 두 개의 중첩 루프가 있습니다. 내부 루프에는 내부 배열을 채우고 외부 루프에서 외부 어레이를 내부 어레이로 채 웁니다.

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

결국 내 행렬에는 두 개의 배열이 채워집니다. 각 배열에는 마지막 반복에서 계산 된 값이 포함됩니다. 매트릭스의 첫 번째 요소가 첫 번째 컴퓨팅 배열을 포함하려면 각 루프에서 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