문제

우리가 알고있는 것처럼, 루비 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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top