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


15

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

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

두 가지 훌륭한 답변 (지금까지). 운이 좋다!
캐리 스월 랜드

답변:


13

방법이 있다고 해

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

Nitpick : Object#method이 아닌 bound을 반환 Method합니다 UnboundMethod. 방법은있다 바인딩 이 인스턴스에서 그것을 호출하기 때문에 수신기에 있으며, 따라서 알고 self, 반면 Module#instance_method반환 UnboundMethod그것과 함께 사용하도록 갈 무슨 예를 알 수 없기 때문이다.
Jörg W Mittag

@ JörgWMittag 수정 해주셔서 감사합니다. .instance_method방금 (결점이있는) 메모리를 사용 하고 있었기 때문에 믹싱해야했을 것입니다.
max pleaner

10

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 이라고 표현됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.