2012-01-07 4 views
3

가능한 중복 :왜 Ruby 배열에서 유효 범위 색인에 액세스 할 수 있습니까?

def test_slicing_arrays 
    array = [:peanut, :butter, :and, :jelly] 

    assert_equal _, array[0,1] 
    assert_equal _, array[0,2] 
    assert_equal _, array[2,2] 
    assert_equal _, array[2,20] 
    assert_equal _, array[4,0] 
    assert_equal _, array[4,100] 
    assert_equal _, array[5,0] 
end 

당신은 올바른 문으로 _ 입력해야합니다 : 루비 화두 중 하나에서
Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)

는 다음과 같은 문제가있다. 첫 번째 네 가지 주장은 내가 어떻게 기대할지를 보여 주지만, 나는 마지막 세 가지를 혼동합니다.

array[4,0]array[4,100]과 마찬가지로 []을 제공합니다. 이 시점에서 배열 밖의 범위 (이 경우 3보다 큼)는 단순히 빈 배열을 반환한다는 것을 알았습니다.

그러나 array[5,0]nil을 반환하므로 완전히 혼란 스럽습니다.

누구든지이 동작을 설명 할 수 있습니까?

+1

참조 http://stackoverflow.com/questions/3568222/array-slicing-in-ruby-looking- for-explanation-for-illogical-behaviour-taken-fr – nimrodm

+0

소원 나는 검색 할 때 그 질문을 발견했다 - 고마워. – Martin

+0

질문을 입력했을 때 stackoverflow가 제공 한 관련 질문 목록에서 두 번째로 나왔습니다 (페이지의 오른쪽 사이드 바 참고). 어쨌든 제가 도와 드릴 수있어서 기쁩니다 : – nimrodm

답변

2

Ruby는 정적 언어가 아니므로 미리 배열의 크기를 선언해야합니다. 특정 요소에 할당 할 때 배열을 확장합니다.

일반적으로 우리는 배열의 끝에 추가 것 :

array = []  # => [] 
array << 1  # => [1] 
array += [2]  # => [1, 2] 
array.push(3) # => [1, 2, 3] 

아니면 전면에 밀어 :

array.unshift(0) # => [0, 1, 2, 3] 

요소를 추가 할 수없이 값을 축적 배열을 유지 갭.

array[10] = 10 # => 10 
array   # => [0, 1, 2, 3, nil, nil, nil, nil, nil, nil, 10] 

을 그리고 당신이 발견 한 내용은 다음과 같습니다

우리는 도움이 될 수있는 무작위로도 할 수 있습니다.


당신은 크기로 배열을 미리 정의 할 수 있지만, 동적 남아 :

ary = Array.new(10, nil) # => [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] 
ary[0] = 0    # => 0 
ary[10] = 10    # => 10 
ary      # => [0, nil, nil, nil, nil, nil, nil, nil, nil, nil, 10] 
ary[12]=12    # => 12 
ary      # => [0, nil, nil, nil, nil, nil, nil, nil, nil, nil, 10, nil, 12] 
+0

더 엄격한 행동이 필요한 경우 [fetch] (http://ruby-doc.org/core-1.9.3/Array.html#method-i-fetch). 인덱스가 배열 외부에있는 경우 오류 (또는 기본값 또는 블록 결과)를 반환 할 수 있습니다. – steenslag

+0

모든 점에서, 이것은 루비 초급자가 필요로하는 명확성에 대한 질문에 대답하지 않습니다. 중복 된 질문에 대한 [top answer] (http://stackoverflow.com/a/3568281/26737)는 훨씬 명확합니다. – Manur

+0

질문에 대답하는 사람의 만족을 위해 질문에 대답하는 것으로 보입니다. 그것이 바로 측정 단위입니다. –

관련 문제