더 자연스러운 Proc Calling in Ruby 1.9.
문제
우리가 알고있는 것처럼, 루비 1.9
에서 proc 호출의 몇 가지 방법이 있습니다. f =->n {[:hello, n]}
p f[:ruby] # => [:hello, :ruby]
p f.call(:ruby) # => [:hello, :ruby]
p f.(:ruby) # => [:hello, :ruby]
p f === :ruby # => [:hello, :ruby]
.
나는 호기심이 많습니다. 더 많은 '자연'은 무엇을 호출하는 방법을 부르겠습니까?'자연'은 아마도 더 많은 컴퓨터 과학을 의미합니다.
해결책
두 번째 옵션은 가장 많이 사용됩니다.
p f.call(:ruby) # => [:hello, :ruby]
.
표준 방법과 더 유사합니다.또한 일부 라이브러리는 #call
메소드의 가용성을 확인하는 인수 확인을 검사 할 때 실제로 오리 타이핑에 의존합니다.이 경우 #call
를 사용하면 #call
에 응답하는 Lambda 또는 다른 오브젝트 (클래스 포함)를 제공 할 수 있습니다.
generacodicicetagcode middlewares는이 협약의 훌륭한 예입니다.기본 미들웨어는 람다가 될 수 있으며 클래스를 사용하여보다 복잡한 논리를 제공 할 수 있습니다.
다른 팁
항상 옵션 3을 사용합니다. 괄호없이 메소드를 호출 할 수있는 구문 모호함을 고려하면 실제 메소드 호출 구문에 가장 가깝게 사용할 수 있습니다.
랙 소스 코드에서 처음 사용하는 첫 번째 방법을 보았습니다.그것은 오랫동안 혼란스러워했습니다. lib / rack / builder.rb ( 버전 : 1.6.0.alpha )에서 선택됩니다
module Rack
class Builder
...
def to_app
app = @map ? generate_map(@run, @map) : @run
fail "missing run or map statement" unless app
# This is the first option calling a proc
# @use is a array of procs (rack middleware)
@use.reverse.inject(app) { |a,e| e[a] }
end
...
end
end
. 제휴하지 않습니다 StackOverflow