Program Tip

Ruby에서 블록과 블록의 차이점

programtip 2020. 12. 14. 20:48
반응형

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

반응형