programing

루비의 "for" vs "each"

bestprogram 2023. 6. 6. 10:26

루비의 "for" vs "each"

루비의 루프에 대해 간단히 질문이 있습니다.컬렉션을 통해 반복하는 이 두 가지 방법 사이에 차이점이 있습니까?

# way 1
@collection.each do |item|
  # do whatever
end

# way 2
for item in @collection
  # do whatever
end

차이가 수 있는 것 요.@collection0)입니다.

이것이 유일한 차이점입니다.

각:

irb> [1,2,3].each { |x| }
  => [1, 2, 3]
irb> x
NameError: undefined local variable or method `x' for main:Object
    from (irb):2
    from :0

대상:

irb> for x in [1,2,3]; end
  => [1, 2, 3]
irb> x
  => 3

for반복기 변수는 블록이 완료된 후에도 계속 유지됩니다.each루프가 시작되기 전에 로컬 변수로 이미 정의되지 않은 경우 루프가 발생합니다.

외에는 그저나나.for는 단구문설뿐입다니일탕지▁▁the▁for▁syntax▁just의 구문 sugar일 뿐입니다.each방법.

@collection이라nil 모두 를 던집니다. 예를 들어 "예외입니다.

예외: main에 대해 정의되지 않은 로컬 변수 또는 메서드 '@collection':물건

좋은 설명은 "For Loop의 폐해"를 참조하십시오(변수 범위 지정을 고려할 때 한 가지 작은 차이가 있습니다).

용사를 합니다.each루비를 더 관용적으로 사용하는 것으로 간주됩니다.

첫 번째 예는

@collection.each do |item|
  # do whatever
end

관용적입니다.Ruby는 다음과 같은 구조의 루프를 지원합니다.for그리고.while일반적으로 블록 구문이 선호됩니다.

또 다른 미묘한 차이는 변수 내에서 선언하는 변수입니다.for루프는 루프 외부에서 사용할 수 있는 반면, 반복기 블록 내의 루프는 효과적으로 비공개입니다.

하나 더 다른..

number = ["one", "two", "three"]
 => ["one", "two", "three"] 

loop1 = []
loop2 = []

number.each do |c|
  loop1 << Proc.new { puts c }
end
 => ["one", "two", "three"] 

for c in number
  loop2 << Proc.new { puts c }
end
 => ["one", "two", "three"] 

loop1[1].call
two
 => nil 

loop2[1].call
three
 => nil 

출처: http://paulphilippov.com/articles/enumerable-each-vs-for-loops-in-ruby

더 명확하게 하기 위해: http://www.ruby-forum.com/topic/179264#784884 .http://www.ruby-forum.com/topic/179264#784884

로 대절사안을 하지 마세요.for그것은 거의 추적 불가능한 버그를 일으킬 수 있습니다.

속지 마세요, 이것은 관용 코드나 스타일 문제에 관한 것이 아닙니다.의 Ruby 구현 »for심각한 결함이 있으므로 사용해서는 안 됩니다.

여기에 다음과 같은 예입니다.for를 소개합니다,그를소다버니개합을 합니다.

class Library
  def initialize
    @ary = []
  end
  def method_with_block(&block)
    @ary << block
  end
  def method_that_uses_these_blocks
    @ary.map(&:call)
  end
end

lib = Library.new

for n in %w{foo bar quz}
  lib.method_with_block { n }
end

puts lib.method_that_uses_these_blocks

프린트

quz
quz
quz

용사를 합니다.%w{foo bar quz}.each { |n| ... }

foo
bar
quz

왜요?

for 변를반니다합복수를 반복합니다.n한 번만 정의된 다음 하나의 정의가 모든 반복에 사용됩니다. 각 한 블록을 의미합니다.n이 의가가있인quz루프가 끝날 때까지.기랄!

each fresh variable ▁a▁loop다.n반복에 됩니다. 를 들어 " " " " " " " " (": " " " " " " " " " " " " " " " " " 위에 .n세 번에 걸쳐 정의됩니다.따라서 각 블록은 별도의 블록을 참조합니다.n올바른 값을 사용합니다.

요, 가없것보입니다처럼는차.for사용하다each밑에

$ irb
>> for x in nil
>> puts x
>> end
NoMethodError: undefined method `each' for nil:NilClass
    from (irb):1
>> nil.each {|x| puts x}
NoMethodError: undefined method `each' for nil:NilClass
    from (irb):4

Bayard가 말했듯이, 각각은 더 관용적입니다.사용자에게 더 많은 정보를 숨기고 특별한 언어 기능을 필요로 하지 않습니다.페르 텔레마코스의 논평

for .. in ..반복기를 루프의 범위 밖으로 설정합니다.

for a in [1,2]
  puts a
end

나뭇잎들a루프가 완료된 후 정의됩니다.반면에.eachDoesn't.그것이 사용을 찬성하는 또 다른 이유입니다.each온도 변수가 더 짧은 기간을 살기 때문입니다.

(1..4).each { |i| 


  a = 9 if i==3

  puts a 


}
#nil
#nil
#9
#nil

for i in 1..4

  a = 9 if i==3

  puts a

end
#nil
#nil
#9
#9

for' 루프에서 로컬 변수는 각 루프 이후에도 계속 존재합니다.각 루프에서 로컬 변수는 각 루프 후에 새로 고쳐집니다.

제가 알기로는 언어 내 제어 구조 대신 블록을 사용하는 것이 더 관용적입니다.

루비의 인루프에 대한 구체적인 지적을 하고 싶습니다.이것은 다른 언어와 비슷한 구조로 보일 수 있지만, 사실 루비의 다른 모든 루프 구조와 같은 표현입니다.실제로 의 for는 각 반복기와 마찬가지로 Enumerable 개체와 함께 작동합니다.

에 대해 전달된 컬렉션은 각 반복기 메서드가 있는 모든 개체일 수 있습니다.배열과 해시는 각 방법을 정의하고 다른 많은 Ruby 개체도 정의합니다.for/in 루프는 지정된 개체의 각 메서드를 호출합니다.반복기가 값을 산출할 때 for 루프는 각 값(또는 각 값 집합)을 지정된 변수(또는 변수)에 할당한 다음 코드를 실행합니다.

이는 어리석은 예이지만 각 반복기가 수행하는 방법과 마찬가지로 for 루프가 각 메서드를 가진 모든 개체와 함께 작동한다는 점을 보여줍니다.

class Apple
  TYPES = %w(red green yellow)
  def each
    yield TYPES.pop until TYPES.empty?
  end
end

a = Apple.new
for i in a do
  puts i
end
yellow
green
red
=> nil

이제 각 반복기는 다음과 같습니다.

a = Apple.new
a.each do |i|
  puts i
end
yellow
green
red
=> nil

보시다시피, 둘 다 블럭에 값을 반환하는 각 방법에 응답합니다.여기 있는 모든 사람들이 말했듯이, 각 반복기를 for 루프보다 사용하는 것이 확실히 더 좋습니다.저는 단지 루프에서 포어 루프에 마법 같은 것이 없다는 점을 집으로 몰고 가고 싶었습니다.컬렉션의 각 메서드를 호출한 다음 해당 코드 블록으로 전달하는 식입니다.따라서 사용해야 하는 매우 드문 경우입니다.각 반복기는 거의 항상 사용하십시오(블록 범위의 이점 추가).

언급URL : https://stackoverflow.com/questions/3294509/for-vs-each-in-ruby