문제

다음과 같이 블록 초기화를 사용해야 할 이유가 있습니까?

x = Observer.new do
  add_event(foo)
  some_other_instance_method_on_observer
  self.some_attribute = something
end

인스턴스 변수에서 다음과 같은 인스턴스 변수를 사용하여 속성을 초기화하는 대신 다음과 같습니다.

x = Observer.new
x.add_event(foo)
x.some_other_instance_method_on_observer
x.some_attribute = something
도움이 되었습니까?

해결책

여기서 유일한 이유는보다 간결한 코드를 가지고 있기 때문입니다 (메소드 호출 전에 인스턴스 이름을 추가 할 필요가 없습니다). 일반적으로 블록을 사용하면 매우 깔끔하고 간결하며 읽기 쉬운 코드를 작성할 수 있습니다. 때로는 코드 소비자에게 많은 타이핑 및 코드 로직을 저장할 수 있습니다. 여기에 전통적인 경우가 있습니다!

file = File.open("some_file.txt","w")
file << "more code"
file.close

이 멋진 블록 대안과 비교하십시오.

File.open("some_file.txt","w") { |file| file << "adding new stuff" }

그것은 파일을 직접 열고 닫아야한다는 번거 로움에서 사용자를 저장했습니다. 대신 그는 그가 원하는 것에 집중했습니다.

멋진 DSL을 쓰고 싶을 때 그러한 상황에서 블록을 투자하십시오.

다른 팁

한 가지 장점은 이러한 추가 작업이 초기화 조치라는 것이 분명하다는 것입니다.

Khell의 답변을 바탕으로 블록 내에서 생성 된 변수는 블록 외부의 범위를 벗어나게됩니다. 이는 더 이상 사용하지 않으면 좋은 일입니다.

코드가 메소드에있는 경우 객체를 반환합니다. 비교하다

def create_observer
    Observer.new {|x| x.foo, x.bar = calculate_foo, calculate_bar }
end

def create_observer
    x = Observer.new
    x.foo = calculate_foo
    x.bar = calculate_bar
    x
end

따라서 블록을 사용하면 한 줄로 논리를 쓸 수 있습니다. 두 번째 예제에서 병렬 할당을 사용하더라도 여전히 3 줄이 필요합니다.

또한 확인하십시오 tap 여기. 비슷한 이점이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top