2016-12-29 2 views
10

루비 다음 IRB루비 {} 블록 구분 기호와 루프 오류가있는 언어에서

for fruit in ['apple', 'banana', 'cherry', 'date'] do 
    puts fruit 
end 

에서 작동하지만이 중 하나는 다음과 같은 블록 구분 기호가 할 참조를 위해 유의하시기 바랍니다

# error 
for fruit in ['apple', 'banana', 'cherry', 'date'] { puts fruit } 

하지 않습니다 오류가 아님

5.times do |i| 
    puts "hello "+i.to_s 
end 

5.times { |i| puts "hello "+i.to_s } 

편집 : 내가 관찰 한 것은 끝이 대체 방법과 일치하지 않는다고 생각합니다. 왜 누군가가 설명해 주거나 내 실수를 지적 할 수 있습니까?

+0

이유는 모른다, 그러나 유사한 제한뿐만 아니라 do' 을 수정'에있다. –

+0

위안이라면'for' 루프에서'do'를 열 필요가 없습니다. –

+0

이것은 'for'와'while'('for '처럼 작동)이 메소드가 아니라는 사실과 관련이있을 수 있습니다. 하지만 형식적인 추론을 기다리고 있습니다. –

답변

10

this 포스트의 다음 인용문은 "불일치"잘 (강조 광산) 설명 :

end 컨텍스트를 종료하는 일반 키워드입니다 (조건문, 클래스 및 모듈 정의, 메소드 정의, 루프 및 예외 - catch [statements]). 중괄호는 블록 또는 해시를 정의하는 특수 구문입니다 (). 하지 블록 인수 방법 - - 따라서 그들은 end 키워드를 닫아야합니다

for 루프 제어 구조입니다. Enumerable#timesEnumerable#each과 같은 메서드는 { } 또는 do ... end 구문 중 하나를 사용하여 정의 할 수있는 블록 인수를가집니다.

+0

위대한 답변! 감사. – PrimeLens

0

forObject 또는 Kernel에 정의 된 메서드가 아니며 블록을 필요로하지 않습니다.

당신은 쓸 수 없습니다 :

class A { 
    def method { 
    } 
} 

를 하나.

사용자 지정 my_for 방법을 정의 할 수 있습니다 :

module Kernel 
    def my_for(elements, &block) 
    elements.each(&block) 
    end 
end 

my_for ['apple','banana','cherry', 'date'] do |fruit| 
    puts fruit 
end 

my_for ['apple','banana','cherry', 'date'] { |fruit| puts fruit } 
+1

'in' 루비 유효한 제어 식이기 ... http://ruby-doc.org/core-2.4.0/doc/syntax/control_expressions_rdoc.html#label-for+합니다 ([문서] 참조 고리). – cobaltsoda

관련 문제