루비 자동 카운터?


134

for-each와 카운터를 사용하고 싶습니다.

i=0
for blah in blahs
    puts i.to_s + " " + blah
    i+=1
end

더 좋은 방법이 있습니까?

참고 :blahs 배열인지 해시 인지 는 모르겠지만 blahs[i]더 해야하지는 않습니다. 또한 i++루비 로 쓰는 법을 알고 싶습니다 .


기술적으로 Matt와 Squeegy의 대답은 처음에 왔지만, 나는 paradoja에 대한 가장 좋은 대답을하고 있습니다. 또한 그의 대답에는 버전에 대한 메모가 있었으며 여전히 Ubuntu 8.04가 Ruby 1.8.6을 사용하는 한 관련이 있습니다.


puts "#{i} #{blah}"훨씬 간결한 것을 사용해야 합니다.


Ruby에는 증가 연산자가 없습니다. 당신이 작성한 n + = 1이 가장 가까운 값입니다. 그것은 n + = 1에 대한 구문 설탕이어야하고, 이는 그 자체가 n = n + 1에 대한 속기입니다. ++의 아이디어는 변수를 다시 할당한다는 사실을 숨기므로 거부되었습니다. rubyurl.com/Dsb1
Chuck

좋은! 고마워 척 Java로 ++ i와 i ++를 배워야했기 때문에 항상 존재한다고 생각했습니다.
Dan Rosenstark 09

답변:


190

사람들이 말했듯이 사용할 수 있습니다

each_with_index

그러나 "각"과 다른 반복자가있는 인덱스를 원할 경우 (예를 들어, 인덱스 또는 이와 유사한 것을 사용하여 매핑하려는 경우) each_with_index 메소드로 열거자를 연결하거나 with_index를 사용할 수 있습니다.

blahs.each_with_index.map { |blah, index| something(blah, index)}

blahs.map.with_index { |blah, index| something(blah, index) }

루비 1.8.7과 1.9에서 할 수있는 일입니다.


1
이것이 1.9의 새로운 기능이라는 점은 주목할 가치가 있습니다.
Zach Langley

1
잘 발견되었습니다. 실제로 1.8.7에도 있지만 추가 할 가치가 있습니다.
paradoja

우분투에 모든 것을 설치 한 경우 왜 Ruby 1.8.6을 사용합니까? 1.8.7 실험 / 베타입니까?
Dan Rosenstark 09

어떤 우분투를 사용하고 있습니까? Intrepid에는 1.8.7이 있습니다. 마지막으로 안정적인 버전입니다 ( ruby-lang.org/en/downloads ). 당신은, 그러나, 1.8.6 루비 monkeypatch이 같은 동작을 할 수있다 (참조 strictlyuntyped.com/2008/09/ruby-187s-enumerator-class.html ).
paradoja

3
배포판이 뒤쳐져 서 피곤했고 rvm을 사용하여 Ubuntu 및 Linux Mint에서 Ruby 설치를 관리하기 시작했습니다.
Tin Man

55
[:a, :b, :c].each_with_index do |item, i|
  puts "index: #{i}, item: #{item}"
end

당신은 이것을 위해 이것을 할 수 없습니다. 나는 보통 어쨌든 각자에게보다 선언적인 부름을 좋아한다. for 구문의 한계에 도달하면 다른 양식으로 쉽게 전환 할 수 있기 때문입니다.


좋은, 나는 구문에 대한 한계에 대한 요점을 본다. 여러 매개 변수가있는 블록에 익숙해 져야합니다.
Dan Rosenstark

11

예, collection.each루프를 수행 한 다음 each_with_index인덱스를 가져옵니다.

루비 책을 읽어야 할 것입니다. 루비 책은 근본적인 루비이므로 모르는 경우 큰 어려움에 처하게됩니다 ( http://poignantguide.net/ruby/ ).

Ruby 소스 코드에서 가져온 것 :

 hash = Hash.new
 %w(cat dog wombat).each_with_index {|item, index|
   hash[item] = index
 }
 hash   #=> {"cat"=>0, "wombat"=>2, "dog"=>1}

문제 없습니다. 기꺼이 도와 드리겠습니다. 각 블록에 대해 "의미"라는 의미는 아니 었습니다. 이것들은 근본적인 루비 구조이며 즉시 배우는 것은 정말 고통 스럽습니다. :) 총알을 물고 몇 시간을 읽는 것이 가장 좋습니다!
Matt Rogish

6

의 새 버전이없는 경우이 메소드를 each_with_index사용하여 zip색인을 요소와 쌍을 지정할 수 있습니다 .

blahs = %w{one two three four five}
puts (1..blahs.length).zip(blahs).map{|pair|'%s %s' % pair}

어떤 생산 :

1 one
2 two
3 three
4 four
5 five

1
'%s %s' % [1, "two"]Ruby 문서 의 답변 에서이 코드를 어디에서 찾을 수 있습니까 ? 압축 및 매핑을 위해 한 줄을 사용하여 수직 공간을 절약하고 도움을 주셔서 감사합니다.
Dan Rosenstark

1
이러한 맥락에서 % 부호 연산자는 String 클래스의 메서드입니다. ruby-doc.org/core/classes/String.html#M000770 에서 읽을 수 있습니다 . 또는 명령 프롬프트에서 ri String # %를 입력 할 수 있습니다. 또는 ri %를 입력하여이를 인식하는 모든 문서화 된 클래스를 볼 수 있습니다 (예 : ri Fixnum # %에서 더 친숙한 의미).
조지

4

에 대한 질문에 관해서 i++는 Ruby에서 그렇게 할 수 없습니다. i += 1당신이 한 문장은 당신이 그것을 할 거 야 정확한 방법이다.



1

blahsEnumerable에서 혼합되는 클래스 인 경우 다음 을 수행 할 수 있어야합니다.

blahs.each_with_index do |blah, i|
  puts("#{i} #{blah}")
end

1

각각에 대한 루비 색인을 얻으려면 다음을 사용할 수 있습니다

.each_with_index

.each_with_index작동 방식 을 보여주는 예는 다음과 같습니다 .

range = ('a'..'z').to_a
length = range.length - 1
range.each_with_index do |letter, index|
    print letter + " "
    if index == length
        puts "You are at last item"
    end
end

인쇄됩니다 :

a b c d e f g h i j k l m n o p q r s t u v w x y z You are at last item
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.