2014-07-18 1 views
0

내가 jbuilder의 문서에 몰래 해요 : 내가 jbuilder과 함께 몇 가지 코드에 자신이 테스트 한 https://github.com/rails/jbuilder이 구문 작업 수행 방법 :. 객체 (변수 : 특수 기호 : 특수 기호)

json.(@message, :created_at, :updated_at) 

json.created_at(@message.created_at) 
json.updated_at(@message.updated_at) 

그러나 나는 전에이 구문을 발생 적이없는, 그리고 다른 루비이나 레일 문서에 그런 일을 본 적이 없다 :이에 동의어가 될 것으로 보인다. 루비의이 기능은 어디에 문서화되어 있습니까? 무엇 정확히하고 있으며, 거기에 어떤주의 사항이 있습니까?

편집 : 문서화 here으로

class FakeJson 
    def initialize 

    end 

    def call(obj, *methods) 
    methods.each do |method| 
     self.public_send(method, obj.public_send(method)) 
    end 
    end 

    def method_missing(*args) 
    puts "called method with #{args.inspect}" 
    end 
end 

답변

1

중화 인민 공화국을 :

은 첫 번째 대답 후, 나는 지금 json 객체가이 같이 보입니다하고 call 메소드를 구현 의심 .()는 주어진 매개 변수로 prc.call()을 호출합니다. "전화"를 숨기는 구문 설탕입니다. 나는 json가 PROC 또는 call가 정의 된 다른 객체 추측

->x, y, z{x + y + z}.(1, 2, 3) 
# => 6 

, 그리고 call 세 개의 인수 @message, :created_at:updated_at에 -ed되어 같은

그것은 작동합니다.

+1

오! 나는 지금 그것을 얻는다라고 생각한다. JBuilder는 json 출력을 생성하는 블록 안에 자체 DSL을 가지고 있습니다. 나는'json' 객체가 (나의 위의 편집) – nzifnab

+1

처럼 보일지도 모른다라고 생각한다. json은 proc이지, @message가 아니다. – jshort

+0

@jshort 네 말이 맞다. 나는 그것을 바로 잡았다. – sawa

1

일반적으로 도트 '.'가 표시됩니다. 메소드 이름 앞에 :

"Hello".index("e") 

여기서 index는 메소드의 이름이고 "e"는 메소드에 대한 인수입니다.)

"Hello".index "e" 

그래서 당신이 경우에 당신이 (즉, 언급하는 것을 생각할 것입니다 정확히 사실이 아니다 메소드의 이름이다 : 단지 내가 괄호를 사용하지만이 필요하지 않다는 발생 . 그것은 단지 통사론적인 설탕입니다. 발동 객체 (또는 #call를 구현하는 일반 오브젝트)의 경우

, obj.(args)는 등가이다 obj.call(args) 또는 obj[args] (에만 진정한 PROC의 경우).

+0

사실 그것은 구문 설탕이며, 복잡하지만,'.()'의'()'은 실제로 ** 필수 항목 ** ('-> x {x}. 1 # => error') 선택적인 일반적인 메소드 호출에서'()'와 같지 않습니다. 따라서 어떤 의미에서'()'자체가 메소드 이름이라고 말할 수 있지만'[]'메소드의 경우와 같이 인수를 둘러 쌀 수있는'()'로도 작동합니다. – sawa

+1

좋은 점은 또한 -> x, y {x+y}.((4,5)) # => error 참고 기본적으로 바깥 쪽 괄호가 '메서드 이름'다음이 특정 '메서드'다른 모든 '메서드'같은 내부 괄호의 사용을 허용하지 않는 경우 ... 예, 동의, 회선 :). – jshort