블록을 허용하는 함수 내에서 블록 및 기타 시간을 사용해야하는 이유는 무엇입니까? &Ruby에서 블록과 블록의 차이점
답변
은 로컬 변수이며, &block
은 메소드에 전달 된 블록에 대한 참조입니다. 방법에 블록으로 발동를 전달하는 방법을 호출 할 때 당신은 당신이 블록을 사용하는 것처럼 발동을 사용할 수 있도록
def foo(block = nil)
p block
end
foo # => nil
foo("test") # => test
foo { puts "this block will not be called" } # => nil
def foo(&block)
p block
end
foo # => nil
foo("test") # => ArgumentError: wrong number of arguments (1 for 0)
foo { puts "This block won't get called, but you'll se it referenced as a proc." }
# => #<Proc:[email protected]:20>
또한, &block
를 사용할 수 있습니다.
my_proc = proc {|i| i.upcase }
p ["foo", "bar", "baz"].map(&my_proc)
# => ["FOO", "BAR", "BAZ"]
p ["foo", "bar", "baz"].map(my_proc)
# => ArgumentError: wrong number of arguments (1 for 0)
변수 이름 block
은 특별한 것을 의미하지 않습니다. 원하는 경우 &strawberries
을 사용할 수 있습니다. 여기서 앰퍼샌드가 핵심입니다.
this article이 도움이 될 수 있습니다.
+1과'''& strawberries''는 – raycchan
입니다. 배열에 splat (즉 '*') 연산자를 사용하는 것과 비슷합니다 : def foo (* args) ; other_foo (* args); end'는 임의의 인수 배열을 취해 그 같은 배열을 내부 함수 호출에 전달합니다. 블록을 사용하면'def foo (& block); other_foo (& 블록); 끝 ' –
인수 목록에서 &whatever
은 메서드에 전달 된 블록을 가져 와서 Proc 개체로 래핑합니다. Proc는 whatever
이라는 변수에 저장됩니다. 여기에 앰퍼샌드 뒤에 입력 한 이름 (일반적으로 "블록")이 될 수 있습니다. 메서드 호출 후 &whatever
구문은 Proc를 블록으로 변환합니다. 그래서 당신과 같이하는 방법을 정의하는 경우 : 당신은 그 블록에 다른 방법을 호출 한 후 블록을 소요하는 방법을 정의하고
def thing(&block)
thing2 &block
end
.
블록 전에 &을 설정하지 않으면 Ruby는 함수에 전달한 "블록"과의 관계를 인식하지 못합니다. 여기에 몇 가지 예가 나와 있습니다. 함수에서 나중에 사용하기 위해
def f(x, block); end
f(3) { 2+2 } # gives an error, because "block" is a
# regular second argument (which is missing)
def g(x, &block); end
g(3) { 2+2 } # legal
def h(x); end
h(3) { 2+2 } # legal
:
def x(&block) # x is a 0 param function
y(block) # y is a 1 param function (taking one "Proc")
z(&block) # z is a 0 param function (like x) with the block x received
end
당신이 z(&block)
를 호출한다면, 그것의 (거의!) z { yield }
를 호출하는 것과 같은 : 당신은 그냥 다음 기능 블록을 전달합니다.
- 1. CruiseControl.NET의 SVN workingDirectory config 블록과 프로젝트의 차이점
- 2. 차이점 downcase와 downcase의 차이점! Ruby에서
- 3. Ruby에서 블록의 클래스/객체 메소드를 제공하는 방법은 무엇입니까?
- 4. 명세서 블록의 변수 범위
- 5. Ruby 블록의 문제
- 6. 슈퍼 블록의 내용을 인쇄하십시오.
- 7. 코드 블록의 오류
- 8. 특정 블록의 xml 복사하기
- 9. 루비 블록의 동적 중첩
- 10. C# 코드 블록의 Genericics
- 11. Drupal 블록의 시간 스케줄러
- 12. 블록의 다른 UIViewAnimations와 섞임
- 13. Windows 및 블록의 PHP
- 14. catch 블록의 순서가 중요합니까?
- 15. div 블록의 이동을 중지하십시오.
- 16. 블록의 주석 변수로드
- 17. 동기화 된 블록의 Java 스레드 잠금
- 18. Ruby에서 블록이 Smalltalk에 비해
- 19. 방법과 기능 코드 블록과 일치하는 정규 표현식
- 20. CanCan 사용자 지정 작업이 블록과 작동하지 않습니다.
- 21. IronPython의 C# "using"블록과 동일한 기능은 무엇입니까?
- 22. Rebol의 블록과 같은 Rebol의 DOM 라이브러리?
- 23. 자바의 정적 블록과 동일한 스칼라 란 무엇입니까?
- 24. cuda 커널을위한 블록과 쓰레드의 수와 사용 방법
- 25. JSON 결과 내 아약스 블록과 같이 보이는
- 26. Ruby 블록과 params를 사용하여 템플릿을 말리십시오.
- 27. 블록과 콜백 간의 성능 차이는 무엇입니까?
- 28. 엔터프라이즈 라이브러리 검증 블록과 규칙 세트
- 29. IE5와 IE8의 차이점 모드 차이점
- 30. MikTeX에서 한 블록의 텍스트를 이스케이프?
아주 좋은 질문 @collimarco –