나는 Array
-> |value,index|
및 Hash
-> |key,value|
가 미쳤다고 말하지 는 않지만 (Horace Loeb의 의견 참조)이 배열을 기대할 수있는 건전한 방법이 있다고 말하고 있습니다.
배열을 다룰 때 배열의 요소 (색인이 일시적이기 때문에 색인이 아님)에 중점을 둡니다. 이 방법은 각각 인덱스, 즉 각 + 인덱스 또는 | each, index | 또는 |value,index|
입니다. 이는 인덱스가 선택적 인수로 간주되는 것과 일치합니다. 예 : | value | | value, index = nil |와 같습니다. | value, index |와 일치합니다.
해시를 다룰 때 종종 값보다 키에 더 집중하고 일반적으로 키와 값을 순서대로 key => value
또는으로 처리 hash[key] = value
합니다.
오리 타이핑을 원한다면 Brent Longborough가 보여준대로 정의 된 방법을 사용하거나 maxhawkins가 보여준 암시 적 방법을 사용하십시오.
루비는 프로그래머가 언어에 맞게 수용하는 것이 아니라 프로그래머에게 맞게 언어를 수용하는 것에 관한 것입니다. 이것이 많은 방법이있는 이유입니다. 무언가를 생각하는 방법은 너무 많습니다. Ruby에서 가장 가까운 코드를 선택하면 나머지 코드는 대개 매우 깔끔하고 간결하게 표시됩니다.
원래 질문에 대해서는 "루비에서 배열을 반복하는"올바른 "방법은 무엇입니까?"라고 생각합니다.
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
그러나 루비는 강력한 구문 설탕과 객체 지향적 인 힘에 관한 것이지만 어쨌든 해시와 동일하며 키를 주문할 수 있습니다.
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
그래서 제 대답은 "루비에서 배열을 반복하는"올바른 "방법은 여러분 (예 : 프로그래머 또는 프로그래밍 팀)과 프로젝트에 달려 있습니다." 더 나은 Ruby 프로그래머가 더 나은 선택을합니다 (어떤 구문 능력 및 / 또는 어떤 객체 지향 접근법). 더 나은 Ruby 프로그래머는 계속해서 더 많은 방법을 찾습니다.
이제 다른 질문을하고 싶습니다. "루비에서 Range를 거꾸로 반복하는"올바른 "방법은 무엇입니까?" (이 질문은 내가이 페이지에 온 방법입니다.)
전달하는 것이 좋습니다.
(1..10).each{|i| puts "i=#{i}" }
그러나 나는 뒤로하고 싶지 않습니다.
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
글쎄, 나는 실제로 그렇게 많이 신경 쓰지 않지만 뒤로 거꾸로 가르치는 경우 학생들에게 멋진 대칭을 보여주고 싶습니다 (예 : 역 차이 또는 단계 -1 만 추가하지만 최소한의 차이는 있지만 다른 것을 수정). 당신은 할 수 있습니다 (대칭) :
(a=*1..10).each{|i| puts "i=#{i}" }
과
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
별로 마음에 들지 않지만 할 수는 없습니다
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
당신은 궁극적으로 할 수 있습니다
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
그러나 객체 지향 접근법보다는 순수한 루비를 가르치고 싶습니다 (아직도). 거꾸로 반복하고 싶습니다.
- 배열을 만들지 않고 (0..1000000000 고려)
- 모든 범위에서 작동 (예 : 정수가 아닌 문자열)
- 추가적인 객체 지향적 힘을 사용하지 않는 것
pred
메서드 를 정의하지 않으면 이것이 불가능하다고 생각합니다. 즉, Range 클래스를 사용하여 수정합니다. 이 작업을 수행 할 수있는 경우 알려주십시오. 그렇지 않으면 불가능한 확인은 실망 스럽지만 감사하겠습니다. 아마도 루비 1.9가 이것을 해결합니다.
(이 글을 읽어 주셔서 감사합니다.)
array#each_with_index
용도를|value, key|
메소드 이름이 순서를 의미하기 때문에 순서가 사용되는 반면,hash#each
모방hash[key] = value
구문?