루비의 "for" vs "each"
루비의 루프에 대해 간단히 질문이 있습니다.컬렉션을 통해 반복하는 이 두 가지 방법 사이에 차이점이 있습니까?
# way 1
@collection.each do |item|
# do whatever
end
# way 2
for item in @collection
# do whatever
end
차이가 수 있는 것 요.@collection
0)입니다.
이것이 유일한 차이점입니다.
각:
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
루프가 완료된 후 정의됩니다.반면에.each
Doesn'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
'programing' 카테고리의 다른 글
이러한 파일 또는 디렉터리 "제한"이 없습니다.Alpine Linux에 Pillow를 설치할 때 h" (0) | 2023.06.06 |
---|---|
NodeJs용 MariaDB 커넥터 | 존재하지 않는 경우 값을 삽입하는 방법 (0) | 2023.06.06 |
'액세스-컨트롤-오리진 허용' 헤더의 작동 방식은 무엇입니까? (0) | 2023.06.06 |
모두 안드로이드입니다.지원 라이브러리는 정확히 동일한 버전 사양을 사용해야 합니다. (0) | 2023.06.06 |
PyInstaller로 데이터 파일 번들(--파일 하나) (0) | 2023.06.06 |