블록 초기화를 사용하는 데있어 장점이 있습니까?
-
07-07-2019 - |
문제
다음과 같이 블록 초기화를 사용해야 할 이유가 있습니까?
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
여기. 비슷한 이점이 있습니다.
제휴하지 않습니다 StackOverflow