무슨 &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
유일한 인수로.
:function
A는 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 이라고 표현됩니다 .