2011-09-30 2 views
3

저는 java/C++ 배경에서 왔고 방금 Ruby를 배우기 시작했습니다. 방법에 붙어있는 블록을 이해하는 데 문제가 있습니다. 이 방법은 데이터베이스를 마이그레이션하는 데 사용됩니다.Create_table 메서드/블록

create_table :model_names do |t| 
    t.string :name 
    t.string :address 
    t.timestamps 
end 

제 질문은 : rake db : migrate 명령을 사용할 때입니다. 이 함수는 create_table 메소드를 호출하고 TableDefinition 객체를 전달합니다.이 객체는 | t | 내 블록에 해당 객체 속성을 설정 하시겠습니까?

답변

2

여기 예제의 경우와 같이 블록을 메서드에 전달할 때 블록을 사용하는 방법과 방법을 결정하는 방법이 다릅니다. 메소드의 설명서 및/또는 소스 코드를 읽으면 블록에 필요한 매개 변수 (있는 경우)를 이해해야합니다.

의 경우 개체가 준비되어 create_table 메서드 자체에서 전달됩니다. rake과 관련 작업은이 시점에서 아무 관련이 없으며 실행 메커니즘으로 만 사용됩니다.

그것은, 루비 블록 0 회 이상 호출 할 수 있다는 것을 명심하는 것이 중요합니다 즉시 또는 미래에서 중. 즉, 블록이 즉시 호출되는지, 나중에 호출되는지, 호출되지 않을지, 호출되지 않을지, 호출되는 횟수를 확신 할 수 없습니다. 당신이 가질 수있는 유일한 기대는 블록을 보내는 방법에 의해 결정됩니다.

yield을 사용하여 블록을 실행하지 않으므로 아무 것도 일어나지 않을 곳에 원하는 블록을 전달할 수 있습니다.

비슷한 구조의 언어를 사용하지 않는 한 블록이 처음에는 다소 혼란 스러울 수 있습니다. 자바 스크립트 프로그래머는 function 객체를 전달하는 것에 익숙 할 것입니다.이 객체는 기본적으로 여기서 모두 수행합니다.하지만 Ruby 용어에서는 암시 적 인수로 전송되는 Proc입니다.

create_table('model_names', function(t) { 
    t.string('name'); 
    t.string('address'); 
    t.timestamps(); 
}); 

같은 철자 당신이 단순히 기능에 보내는 명백하고, 그것을 실행하기 create_table 기능에 달려있다 : 같은 더 자바 스크립트 맛 예에서

,이 보일 것이다. 루비는 블록이 즉시 실행되는 것처럼 보일 수도 있지만 블록을 선언하는 데는 do ... endbegin ... end 사이에 큰 차이가 있습니다.

관련 문제