반응형
Ruby에서 블록과 블록의 차이점
블록을 허용하는 함수 내에서 블록 및 다른 시간 및 블록을 사용해야하는 이유는 무엇입니까?
block
단지 지역 변수이며 &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:0x0000000100124ea8@untitled:20>
또한 &block
메서드를 호출 할 때 proc을 블록으로 메서드에 전달할 때 사용할 수 있으므로 블록을 사용하는 것처럼 procs를 사용할 수 있습니다.
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
경우 앰퍼샌드를 사용할 수 있습니다 .
인수 목록 &whatever
에서 메서드에 전달 된 블록을 가져와 Proc 개체로 래핑합니다. Proc는라는 변수에 저장됩니다 whatever
(물론 앰퍼샌드 다음에 입력 한 이름이 될 수 있습니다. 일반적으로 "블록"). 메서드 호출 후 &whatever
구문은 Proc를 블록으로 바꿉니다. 따라서 다음과 같은 방법을 정의하면 :
def thing(&block)
thing2 &block
end
블록을 취한 다음 해당 블록으로 다른 메서드를 호출하는 메서드를 정의하고 있습니다.
& before 블록을 설정하지 않으면 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 }
합니다. 블록을 다음 함수에 전달하면됩니다.
참고URL : https://stackoverflow.com/questions/1386276/difference-between-block-and-block-in-ruby
반응형
'Program Tip' 카테고리의 다른 글
Webpack을 사용하여 프로젝트에서 여러 파일 항목 및 출력을 설정하는 방법은 무엇입니까? (0) | 2020.12.14 |
---|---|
mp3 파일을 병합하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.14 |
UIImage의 픽셀 색상 가져 오기 (0) | 2020.12.14 |
최고의 청결 / 안전 기능 (0) | 2020.12.14 |
마우스 휠로 tmux 패널에서 스크롤을 활성화하는 방법은 무엇입니까? (0) | 2020.12.14 |