[ruby] `& method (: function)`은 무슨 뜻입니까?

무슨 &method(:function)뜻입니까? 예를 들어 다음 줄이 있습니다.

res = integrate(0, 1, a, &method(:function))



답변

방법이 있다고 해

def add_one(num)
  num + 1
end

그리고 문자열 배열

arr = ["1", "2"]

우리는 map에서 대응하는 출력으로 문자열 목록을 원합니다 add_one.

시작하려면 전화를 걸 수 있습니다

nums = arr.map(&:to_i)

이것은 같은 것입니다

nums = arr.map do |str|
  str.to_i
end

당신은 볼 수 있습니다 루비 평균 :지도 (이름 &을) 무엇을? 이에 대한 자세한 내용은.

그러나 전화를 걸면 작동하지 않습니다.

nums.map(&:add_one)

왜? 숫자에는 메서드가 내장되어 있지 않기 때문입니다 add_one. 그래서 당신은 얻을 것이다 NoMethodError.

따라서 메서드 이름 만 제공하는 대신 바인딩 된 메서드를:add_one 전달할 수 있습니다 . method(:add_one)

nums.map(&method(:add_one))

이제, 각각의 납입이로 사용되는 것이 아니라 수신기 위한 add_one방법, 그들은으로 사용됩니다 인수 . 따라서 본질적으로 다음과 같습니다.

nums.map do |num|
  add_one(num)
end

다른 예를 제공하려면 다음을 비교하십시오.

[1].map(&:puts)
# this is the same as [1].map { |num| num.puts }
# it raises NoMethodError

[1].map(&method(:puts))
# this is the same as [1].map { |num| puts num }
# it prints 1 successfully


답변

method(:function)는 암시 적 수신자 (즉, ) 로 메시지를 보낸다 ( 메소드 호출 이라고도 함 self). 이 메시지를 보내는 method암시 리시버 (에 self전달) :function유일한 인수로.

:functionA는 Symbol문자, 그것의 문자 표기법 즉 Symbol. Symbol“뭔가의 이름”을 나타내는 데이터 형식입니다.

단항 접두사 앰퍼샌드 &연산자 Proc는 a를 블록 으로 “풀 립니다 ” . 즉 Proc, 블록 이 예상되는 위치 를 전달할 수 있습니다 . 객체가 아직이 아닌 경우 객체 를로 변환 할 수 Proc있는 to_proc메시지 가 전송됩니다 Proc. (연산자는 인수 목록에서만 유효하며 마지막 인수에만 유효합니다. &매개 변수 목록에서시길 의 이중입니다 .Proc 객체 합니다.

Proc실행 코드를 나타내는 데이터 유형입니다. 퍼스트 클래스 서브 루틴을위한 Ruby의 핵심 라이브러리 클래스입니다.

그래서,이 무엇 통화 인 method에 방법 self:function인수로, 호출 to_proc반환 값에 “풀다”결과 Proc에 객체 블록 과에 전화로 그 블록을 통과 integrate같은 당신이 쓴 것처럼 뭔가

res = integrate(0, 1, a) do
  # something
end

method여기 의 메소드는 대부분 바운드 오브젝트 Object#method를 리턴하는 메소드 입니다. Method

결국, 이것은 다소

res = integrate(0, 1, a) do |*args, &block|
  function(*args, &block)
end

그러나 일반적으로 pointfree style 이라고 표현됩니다 .


답변