Ruby에서 범위로 배열을 채우는 올바른 방법


201

"to_a"메소드를 사용하여 Ranges를 동등한 배열로 변환하는 예제를 제공하는 책을 연구 중입니다.

irb에서 코드를 실행하면 다음 경고가 표시됩니다.

 warning: default `to_a' will be obsolete

to_a를 사용하는 올바른 대안은 무엇입니까?

배열을 Range로 채우는 다른 방법이 있습니까?


7
범위를 배열로 변환 할 때주의해야 할 점은 배열을 만들 때 많은 메모리를 소비 할 수 있으므로주의해서 사용하십시오. 배열을 만드는 대신 메모리 소비를 줄이려면 배열처럼 범위를 반복하는 것이 좋습니다. "필요에 따라 적용"하는 것 중 하나입니다.
Tin Man

답변:


357

splat을 사용하여 범위가있는 배열을 만들 수 있습니다.

>> a=*(1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Kernel Array방법을 사용하여

Array (1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

또는 to_a를 사용하여

(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1
배열이 이미 만들어져 있고 범위를 추가하려면 어떻게해야합니까 order = 1? 그런 다음 order << (2.25).to_a. 그러나 이것은 배열 안에 다른 배열을 만듭니다. 단순히 2에서 25 사이의 범위를 원합니다. 그러나 시도 order << (2.25)하면 오류가 발생하면 Range를 Integer로 변환 할 수 없습니다.
kakubei

1
@kakubei concat대신 사용하십시오 <<. 또한 정수가 아닌 경우 "범위를 정수로 변환 할 수 없습니다"라는 메시지가 표시되지 않아야합니다 order.이 경우 배열이 아닌 비트 시프 팅됩니다.
Kelvin

3
Splat 옵션은 Ruby 1.8.7에서 작동하지 않으므로 (1..10).to_a이전 버전과의 호환성 을 위해 사용 하는 것이 좋습니다.
kylewelsby

5
표시 사용이 불쾌합니다. 더 나은 옵션은 [*1..10]입니다.
Hauleth

2
가장 빠른 방법은 무엇입니까 ??
Andrey Yasinishyn

79

이것은 irb에서 나를 위해 작동합니다.

irb> (1..4).to_a
=> [1, 2, 3, 4]

나는 알아 차렸다 :

irb> 1..4.to_a
(irb):1: warning: default `to_a' will be obsolete
ArgumentError: bad value for range
        from (irb):1

아마도 괄호가 빠져 있습니까?

(나는 Ruby 1.8.6 patchlevel 114를 사용하고있다)


7
설명 : 괄호가 없으면 1..4 범위가 아닌 Fixnum 클래스 인스턴스 (이 경우 4)에서 to_a 메소드를 호출합니다. Fixnum.methods.include?(to_a)루비 1.9.2에서 실행 하면 to_a 메소드가 더 이상 정의되지 않은 것을 알 수 있습니다. 08
Pierre

@Pierre 제 생각에는Fixnum.instance_methods.include?(:to_a)
Kelvin

@Kelvin-사실 methods.include?좀 더 유익합니다 : $ irb irb(main):001:0> Fixnum.methods.include?(to_a) (irb):1: warning: default to_a '는 쓸모 없을 것입니다=> false irb(main):002:0> Fixnum.instance_methods.include?(:to_a) => false
Richard Turner

1
@RichardTurner 루비 1.8을 사용한다고 가정합니다. to_a첫 번째 양식에서 경고를 유발하는 것이 무엇인지 오해하고 있습니다. 호출 to_a하고 있기 때문입니다. self실제로 to_aFixnum의 메소드 인지 확인하지는 않습니다 . to_a스스로 전화 를 걸면 동일한 경고가 표시됩니다.
Kelvin

@ 켈빈-h! 페니가 떨어집니다. 감사.
Richard Turner

34

이렇게하는 것처럼 들립니다.

0..10.to_a

경고는 Range # to_a가 아닌 Fixnum # to_a에서 발생합니다. 대신 이것을 시도하십시오 :

(0..10).to_a



4

방금 더 큰 양에서 작은 양으로 범위를 사용하려고 시도했지만 예상하지 못한 결과를 얻었습니다.

irb(main):007:0> Array(1..5)
=> [1, 2, 3, 4, 5]
irb(main):008:0> Array(5..1)
=> []

그것은 범위 구현 때문입니다.
따라서 다음 옵션을 사용해야했습니다.

(1..5).to_a.reverse

4
오늘은 발견 5.downto(1).to_a감소 범위 표현하는 또 다른 방법이다 stackoverflow.com/a/8927009/703903을
odlp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.