[ruby-on-rails] 루비에서 블록에 대한 do..end vs 중괄호

나는 do..end를 사용해서는 안된다는 것을 적극적으로 확신시키는 동료가 있습니다. 루비에서 여러 줄 블록을 정의하기 위해 중괄호를 대신 사용하십시오.

나는 짧은 원 라이너에 곱슬 중괄호 만 사용하고 다른 모든 것을 위해 끝내야합니다. 그러나 나는 결의를 얻기 위해 더 큰 공동체에 손을 뻗을 것이라고 생각했다.

그래서 그것은 무엇이며 왜 그렇습니까? (일부 머스트 코드의 예)

context do
  setup { do_some_setup() }
  should "do somthing" do
    # some more code...
  end
end

또는

context {
  setup { do_some_setup() }
  should("do somthing") {
    # some more code...
  }
}

개인적으로 위의 내용을 살펴보면 나에게 질문에 대한 답이되지만 더 큰 커뮤니티에 공개하고 싶었습니다.



답변

일반적인 규칙은 여러 줄 블록에 do..end를 사용하고 한 줄 블록에 중괄호를 사용하는 것입니다. 그러나이 예에서 설명 할 수있는 둘 사이에는 차이가 있습니다.

puts [1,2,3].map{ |k| k+1 }
2
3
4
=> nil
puts [1,2,3].map do |k| k+1; end
#<Enumerator:0x0000010a06d140>
=> nil

이것은 {}이 do..end보다 우선 순위가 높으므로 사용하려는 것을 결정할 때 명심하십시오.

추신 : 선호도를 개발하는 동안 명심해야 할 또 하나의 예입니다.

다음 코드 :

task :rake => pre_rake_task do
  something
end

정말 의미합니다 :

task(:rake => pre_rake_task){ something }

그리고이 코드 :

task :rake => pre_rake_task {
  something
}

정말 의미합니다 :

task :rake => (pre_rake_task { something })

따라서 중괄호로 원하는 실제 정의를 얻으려면 다음을 수행해야합니다.

task(:rake => pre_rake_task) {
  something
}

어쩌면 매개 변수에 중괄호를 사용하는 것이 어쨌든하고 싶지만 그렇지 않은 경우이 혼란을 피하기 위해이 경우 do..end를 사용하는 것이 가장 좋습니다.


답변

에서 루비 프로그래밍 :

중괄호는 우선 순위가 높습니다. 우선 순위가 낮습니다. 메소드 호출에 괄호로 묶이지 않은 매개 변수가있는 경우 블록의 중괄호 양식은 전체 호출이 아닌 마지막 매개 변수에 바인드됩니다. do 양식은 호출에 바인딩됩니다.

그래서 코드

f param {do_something()}

param코드를 작성하는 동안 블록을 변수에 바인딩

f param do do_something() end

블록을 함수에 바인딩합니다 f.

그러나 함수 인수를 괄호로 묶는 경우 문제가되지 않습니다.


답변

이것에 대한 몇 가지 견해가 있습니다. 그것은 실제로 개인적인 취향의 문제입니다. 많은 루비 스트들이 당신에게 접근합니다. 그러나 일반적인 두 가지 스타일은 항상 하나 또는 다른 스타일을 사용하거나 {}값을 반환 do ... end하는 블록 과 부작용을 위해 실행되는 블록에 사용하는 것입니다.


답변

중괄호에는 한 가지 주요 이점이 있습니다. 많은 편집자가 편집하기 훨씬 쉬운 시간을 가지므로 특정 유형의 디버깅이 훨씬 쉬워집니다. 한편, “do … end”라는 키워드는 일치시키기가 매우 어렵습니다. 특히 “end”도 “if”와 일치하기 때문입니다.


답변

내가 본 가장 일반적인 규칙 (가장 최근에는 Eloquent Ruby에서 )은 다음과 같습니다.

  • 여러 줄 블록이면 do / end를 사용하십시오.
  • 단일 행 블록 인 경우 {}를 사용하십시오.

답변

할 일 / 종료 투표


컨벤션은 여러 줄 do .. end{ ... }한 줄짜리를위한 것입니다.

그러나 나는 do .. end더 낫습니다. 따라서 하나의 라이너가 있으면 do .. end어쨌든 사용 하지만 세 줄로 do / end에 평소와 같이 형식을 지정합니다. 이것은 모든 사람을 행복하게 만듭니다.

  10.times do
    puts ...
  end

한 가지 문제 { }는 시가 모드 적대적이라는 것입니다 (전체 메소드 호출이 아니라 마지막 매개 변수에 단단히 바인딩되므로 메소드 구문을 포함해야합니다). 그것들은 문장 그룹이 아니며 가독성을 위해 해시 상수와 충돌합니다.

또한 { }C 프로그램에서 충분히 보았습니다 . 평소와 같이 루비의 방식이 더 좋습니다. if블록 에는 정확히 한 가지 유형이 있으며 , 되돌아 가서 명령문을 복합 명령문으로 변환 할 필요가 없습니다.


답변

영향력있는 루비 스트 부부는 리턴 값을 사용할 때는 중괄호를 사용하고 그렇지 않은 경우에는 행 / 종료를 제안합니다.

http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace (보관소에서)

http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc(archive.org )

이것은 일반적으로 좋은 습관처럼 보입니다.

나는이 원칙을 조금 수정하여 읽기가 어렵 기 때문에 한 줄에 do / end를 사용하지 않아야한다고 말하고 싶습니다.

전체 메서드 호출 대신 메서드의 최종 매개 변수에 바인딩되므로 중괄호를 사용하면 더 신중해야합니다. 이를 피하려면 괄호를 추가하십시오.